Cod sursa(job #1886736)

Utilizator trutruvasilicaHuhurez Marius trutruvasilica Data 21 februarie 2017 09:23:54
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int N=1001;
const int MAX_INF=0x3f3f3f3f;
vector<int>H[N];
vector<int>::iterator it;
bitset<N>viz;
int tata[N],f[N][N],C[N][N],n;
queue<int>Q;
bool bfs()
{
    viz[1]=1;
    Q.push(1);
    while(Q.size())
    {
        int a=Q.front();
        Q.pop();
        for(vector<int>::iterator it=H[a].begin();it!=H[a].end();it++)
        {
            if(viz[*it]==0&&(C[a][*it]!=f[a][*it]))
            {
                viz[*it]=1;
                tata[*it]=a;
                Q.push(*it);
            }
        }
    }
    if(viz[n]==1) return 1;
    return 0;
}
int main()
{
    int m,i,a,b,flux=0,fmin,z;
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>a>>b>>z;
        C[a][b]=z;
        H[a].push_back(b);
        H[b].push_back(a);
    }
    while(bfs())
    {
        for(it=H[n].begin();it!=H[n].end();it++)
        {
            if(C[*it][n]!=f[*it][n]&&viz[*it]!=0)
            {
                fmin=MAX_INF;
                tata[n]=*it;
                for(i=n;i!=1;i=tata[i])
                {
                    fmin=min(fmin,C[tata[i]][i]-f[tata[i]][i]);
                }
                if(fmin==0) continue;
                flux+=fmin;
                for(i=n;i!=1;i=tata[i])
                {
                    f[tata[i]][i]+=fmin;
                    f[i][tata[i]]-=fmin;
                }
            }
        }
        viz.reset();
    }
    fout<<flux;
}