Cod sursa(job #852876)

Utilizator andrettiAndretti Naiden andretti Data 11 ianuarie 2013 21:15:29
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<fstream>
using namespace std;
 
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

const int maxn=1005;
int n,m,p,u,flux;
int v[maxn],t[maxn],cc[maxn];
int f[maxn][maxn];
 
void cit()
{
    int i,x,y,cost;
	
    fin>>n>>m;
	
    for(i=1;i<=m;i++)
    {
        fin>>x>>y>>cost;
        f[x][y]=cost;
    }
}
 
int drum()
{
    int i,nod;
	
    for(i=1;i<=n;i++)
        v[i]=0;
	
    p=u=1; cc[1]=1; v[1]=1; t[1]=0;
	
    while(p<=u)
    {
        nod=cc[p];
		if(nod==n) {p++;continue;}
		
        for(i=1;i<=n;i++)
            if(f[nod][i]>0 && v[i]==0)
            {
                u++;
                cc[u]=i;
                t[i]=nod;
                v[i]=1;
            }
        p++;
    }
	
    return v[n];
}
 
void flux_max()
{
    int i,k,min;
    
    while(drum())
	  for(k=1;k<=n;k++)
		if(f[k][n]>0 && v[k])
		{
			t[n]=k;
			min=999999;
         
			for(i=n;t[i]!=0;i=t[i])
				if(min>f[t[i]][i])
				   min=f[t[i]][i];
				
			for(i=n;t[i]!=0;i=t[i])
			{
				f[t[i]][i]-=min;
				f[i][t[i]]+=min;
			}
			
			flux+=min;
		}
    
}
 
int main()
{
    cit();
    flux_max();
    fout<<flux;
	
    fin.close();
    fout.close();
    return 0;
}