Cod sursa(job #954938)

Utilizator tinkyAndrei Ilisei tinky Data 30 mai 2013 14:26:50
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<fstream>
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()
{
	int i;
    while(BF())
	{
        for(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()
{
	ifstream in("maxflow.in");
	ofstream out("maxflow.out");
    int i,x,y,c;
    in>>N>>M;
    for(i=0;i<M;++i)
	{
        in>>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];
	out<<x<<'\n';
    return 0;
}