Cod sursa(job #403149)

Utilizator jupanubv92Popescu Marius jupanubv92 Data 24 februarie 2010 17:50:37
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<stdio.h>
#include<vector>
#include<queue>
#define Nmx 1002
#define INF 1000001

using namespace std;

int n,m,viz[Nmx],prec[Nmx],C[Nmx][Nmx],F[Nmx][Nmx];
vector < int > G[Nmx];
queue < int > Q;

void citire()
{
    scanf("%d%d",&n,&m);
    int x,y,c;
    for(int i=1;i<=m;++i)
    {
        scanf("%d%d%d",&x,&y,&c);
        C[x][y]=c;
        G[x].push_back(y);
        G[y].push_back(x);
    }
}

int bfs()
{
    int nod;
    memset(viz,0,sizeof(viz));
    viz[1]=1;
    for(Q.push(1);!Q.empty();Q.pop())
    {
        nod=Q.front();
        if(nod==n)
            continue;
        for(int i=0;i<G[nod].size();++i)
            if(C[nod][G[nod][i]]-F[nod][G[nod][i]]>0&&!viz[G[nod][i]])
            {
                viz[G[nod][i]]=1;
                prec[G[nod][i]]=nod;
                Q.push(G[nod][i]);
            }
    }
    return viz[n];
}

void solve()
{
    int nod,i,j,sol=0;
    while(bfs())
    for(i=0;i<G[n].size();++i)
    {
        nod=G[n][i];
        if(C[nod][n]-F[nod][n]>0&&viz[nod])
        {
            int Vmin=INF;
            for(j=n;prec[j];j=prec[j])
                Vmin=min(Vmin,C[prec[j]][j]-F[prec[j]][j]);
            for(j=n;prec[j];j=prec[j])
            {
                F[prec[j]][j]+=Vmin;
                F[j][prec[j]]-=Vmin;
            }
            sol+=Vmin;
        }
    }
    printf("%d\n",sol);
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    citire();
    solve();
    return 0;
}