Cod sursa(job #1340305)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 11 februarie 2015 19:01:54
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 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<<'\n';
    return 0;
}
int bf(int i)
{
    int p,j,min=inf;
    for(j=1;j<=N;++j) viz[j]=t[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);
        }
        q.pop();
    }
    if(!t[N]) return 0;
    for(j=N;t[j];j=t[j])
    {
        if(c[t[j]][j]<min) min=c[t[j]][j];
    }
    for(j=N;t[j];j=t[j])
    {
        c[t[j]][j]-=min;
        c[j][t[j]]+=min;
    }
    R+=min;
    return 1;
}