Cod sursa(job #954935)

Utilizator tinkyAndrei Ilisei tinky Data 30 mai 2013 14:19:31
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include<cstdio>
#include<vector>
using namespace std;
int N,M;
//vector<int> nr[1010];
int nr[1010][1010],size[1010];
int F[1010][1010],C[1010][1010],tata[1010];
int Q[2000];
int BF()
{
	int i;
    for(i=0;i<=N;++i)
        tata[i]=0;
    int p,u,x;
    Q[0]=1;
    tata[1]=-1;
    p=u=0;
    while(p<=u){
        x=Q[p++];
        if(x==N)
            continue;
        for(i=0;i<size[x];++i)
		{
            if(!tata[nr[x][i]] && F[x][nr[x][i]]<C[x][nr[x][i]]){
                Q[++u]=nr[x][i];
                tata[nr[x][i]]=x;
            }
        }
    }
    return tata[N];
}
void solve(){
    while(BF()){
        for(size_t i=0;i<size[N];++i){
            int nod=nr[N][i];
            if(!tata[nod] || F[nod][N]==C[nod][N])
                continue;
            tata[N]=nod;
            int cur=N,max=1000000000;
            while(tata[cur]!=-1){
                if(C[tata[cur]][cur]-F[tata[cur]][cur]<max)
                    max=C[tata[cur]][cur]-F[tata[cur]][cur];
                cur=tata[cur];
            }
            if(max==1000000000 || !max)
                continue;
            cur=N;
            while(tata[cur]!=-1){
                F[tata[cur]][cur]+=max;
                F[cur][tata[cur]]-=max;
                cur=tata[cur];
            }
        }
    }
}
int main(){
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int i,x,y,c;
    scanf("%d%d",&N,&M);
    for(i=0;i<M;++i){
        scanf("%d%d%d",&x,&y,&c);
        C[x][y]=c;
        nr[x][size[x]]=y; size[x]++;
        nr[y][size[y]]=x; size[y]++;
    }
    solve();
    x=0;
    for(i=1;i<N;++i)
        x+=F[i][N];
    printf("%d\n",x);
    fclose(stdin);
    fclose(stdout);
    return 0;
}