Cod sursa(job #1165276)

Utilizator Claudiu95Vartolomei Alexandru Claudiu Claudiu95 Data 2 aprilie 2014 16:35:41
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<cstdio>
#define maxn 1003
#include<vector>
#include<queue>
#define inf 2000000003
using namespace std;
int C[maxn][maxn],F[maxn][maxn],t[maxn],flux,fmin,x,y,c,viz[maxn];
unsigned int n,m;
vector <int> G[maxn];
queue <int> Q;
int bfs(){
    for(int i=2;i<=n;++i){
        viz[i]=0;
    }
    viz[1]=1;
    Q.push(1);
    while(!Q.empty()){
        x=Q.front();Q.pop();
        if(x==n)
            continue;
        for(int i=0;i<G[x].size();++i){
            if(viz[G[x][i]] || F[x][G[x][i]]==C[x][G[x][i]])
                continue;
            viz[G[x][i]]=1;
            t[G[x][i]]=x;
            Q.push(G[x][i]);
        }
    }
    return viz[n];
}
void solve(){
    while(bfs()){
        for(int i=0;i<G[n].size();++i){
            if(!viz[G[n][i]] || C[G[n][i]][n]==F[G[n][i]][n] )
                continue;
            t[n]=G[n][i];
            fmin=inf;

            for(int i=n;i!=1;i=t[i]){
                fmin=min(fmin,C[t[i]][i]-F[t[i]][i]);
            }
            if(fmin==0)
                continue;
            for(int i=n;i!=1;i=t[i]){
                F[t[i]][i]+=fmin;
                F[i][t[i]]-=fmin;
            }
            flux+=fmin;
        }
    }
}
int main(){
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;++i){
        scanf("%d%d%d",&x,&y,&c);
        G[x].push_back(y);
        G[y].push_back(x);
        C[x][y]=c;

    }
    solve();
    printf("%d",flux);
    return 0;
}