Cod sursa(job #852817)

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

const int maxn=1005;
int n,m,p,u,nrd,flux;
int d[maxn],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;
    }
}
 
void creare(int k)
{
    if(k!=0)
    {
        creare(t[k]);
        d[++nrd]=k;
    }
}
 
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)
        {
            nrd=0;
            creare(n);
            return 1;
        }
         
        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 0;
}
 
void flux_max()
{
    int i,min;
     
    while(drum())
    {
        min=999999;
         
        for(i=1;i<nrd;i++)
            if(min>f[d[i]][d[i+1]])
               min=f[d[i]][d[i+1]];
             
        for(i=1;i<nrd;i++)
        {
            f[d[i]][d[i+1]]-=min;
            f[d[i+1]][d[i]]+=min;
        }
         
        flux+=min;
    }
}
 
int main()
{
    cit();
    flux_max();
    fout<<flux;
     
    fin.close();
    fout.close();
    return 0;
}