Cod sursa(job #1051616)

Utilizator alecsandrualex cuturela alecsandru Data 10 decembrie 2013 12:37:14
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include<cstdio>
#include<queue>
using namespace std;
const int INF=0x7fffffff;
const int MAXN=1001;
queue <int> q;
int fluxTotal,n,m,i,j,x,y,tata,c,capacitate[MAXN][MAXN],flux[MAXN][MAXN],fluxDrum,rest[MAXN][MAXN],vmin[MAXN],reconst[MAXN];
bool inqueue[MAXN];
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1; i<=m; i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        capacitate[x][y]=c;
        rest[x][y]=c;
    }
    do
    {
        q.push(1);
        inqueue[1]=true;
        vmin[1]=INF;
        for(i=2; i<=n; i++)
        {
            vmin[i]=0;
        }
        while(!q.empty())
        {
            tata=q.front();
            for(i=1; i<=n; i++)
            {
                if (vmin[i]<min(rest[tata][i], vmin[tata]))
                {
                    vmin[i]=min(rest[tata][i], vmin[tata]);
                    reconst[i]=tata;
                    if(!inqueue[i])
                    {
                        q.push(i);
                        inqueue[i]=true;
                    }
                }
            }
            q.pop();
            inqueue[tata]=false;
            /*
            printf("%d::",tata);
            for(i=1;i<=n;i++)
                printf("%d ",vmin[i]);
            printf("\n");//*/
        }
        fluxDrum=vmin[n];
        if(fluxDrum)
            for(i=n; i!=1; i=reconst[i])
            {
                flux[reconst[i]][i]+=fluxDrum;
                flux[i][reconst[i]]-=fluxDrum;
                rest[reconst[i]][i]=capacitate[reconst[i]][i]-flux[reconst[i]][i];
                rest[i][reconst[i]]=capacitate[i][reconst[i]]-flux[i][reconst[i]];
            }
    }
    while (fluxDrum!=0);
    /*
    printf("%d::",fluxDrum);
    for(i=1;i<=n;i++)
    {
        printf("%d ",vmin[i]);
    }
    printf("\n");
    printf("\n");
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
            printf("%d ",rest[i][j]);
        printf("\n");
    }//*/
    for(i=1;i<=n;i++)
    {
        fluxTotal+=flux[i][n];
    }
    printf("%d\n",fluxTotal);
    return 0;
}