Cod sursa(job #976215)

Utilizator monica11Szekely Monica monica11 Data 22 iulie 2013 19:33:00
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<fstream>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int i,j,n,m,a[1001],b[1001],t[1004][1004],f1[1004][1004],x,y,c,inc,sf,min1;
int q[1004],viz[1004],v[1003],s1=0;
int bf()
{
    int st,dr,x,i;
    for(i=1;i<=n;i++)
        viz[i]=0;
    st=dr=0;
    q[0]=1;
    while(st<=dr)
    {
        x=q[st];
        for(i=1;i<=n;i++)
            if(t[x][i]-f1[x][i]>0&&!viz[i])
            {
                viz[i]=1;
                q[++dr]=i;
                v[i]=x;
            }
            st++;
    }
    return viz[sf];
}
int main()
{
    //freopen("maxflow.in","r",stdin);
    //freopen("maxflow.out","w",stdout);
    //scanf("%d%d",&n,&m);
	f>>n>>m;
    for(i=1;i<=m;i++)
    {
        //scanf("%d%d%d",&x,&y,&c);
		f>>x>>y>>c;
        t[x][y]=c;
    }
    inc=1,sf=n;
    while(bf())
    {
        for(i=1;i<=n;i++)
            if(t[i][n]-f1[i][n]>0)
            {
                min1=t[i][n]-f1[i][n];
                for(j=i;j!=inc;j=v[j])
                    if(t[v[j]][j]-f1[v[j]][j]<min1)
                        min1=t[v[j]][j]-f1[v[j]][j];
                    for(j=i;j!=1;j=v[j])
                    {
                        f1[v[j]][j]+=min1;
                        f1[j][v[j]]-=min1;
                    }
                    f1[i][n]+=min1;
                    f1[n][i]-=min1;
                    s1+=min1;
            }
    }
    //printf("%d",s1);
	g<<s1;
    return 0;
}