Cod sursa(job #1339940)

Utilizator andreiulianAndrei andreiulian Data 11 februarie 2015 12:42:04
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
const int inf = 1<<30;
#define pb push_back
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int N,M,t[1005],c[1005][1005],drum[1005],u,R;
bool viz[1005];
vector<int> v[1005];
queue<int> q;
int bf(int i);
int main()
{
    in>>N>>M;
    int A,B,C;
    for(;M;--M)
    {
        in>>A>>B>>C;
        v[A].pb(B);
        v[B].pb(A);
        c[A][B]=C;
    }
    while(bf(1));
    out<<R;
}
int bf(int i)
{
    int p,j,min=inf;
    for(j=1;j<=N;++j) viz[j]=0;
    vector<int> :: iterator it;
    q.push(i);
    viz[i]=1;
    while(!q.empty())
    {
        p=q.front();
        drum[++u]=p;
        for(it=v[p].begin();it!=v[p].end();++it)
            if(!viz[*it] && c[p][*it])
        {
            viz[*it]=1;
            t[*it]=p;
            q.push(*it);
            if(c[p][*it]<min) min=c[p][*it];
            break;
        }
        q.pop();
    }
    if(min==inf) return 0;
    while(u>1)
    {
        c[drum[u-1]][drum[u]]-=min;
        c[drum[u]][drum[u-1]]+=min;
        --u;
    }
    R+=min;
    return 1;
}