Cod sursa(job #1122055)

Utilizator RadEmanuelRad Emanuel RadEmanuel Data 25 februarie 2014 15:44:37
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<fstream>
#include<vector>
#include<list>
#define dmax 1001
#define INF 2147000000
using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
list<int> lista;
list<int>::iterator it;
vector<int> q(dmax,0);
vector< list<int> >l(dmax,lista);
int i,n,m,maxflow,x,y,c,minn;
int d[dmax],viz[dmax],cap[dmax][dmax],flux[dmax][dmax];

int bf()
{
    int ls=0,ld=0;
    for(i=1;i<=n;++i)
        viz[i]=d[i]=0;
    for(i=0;i<=20;++i) q[i]=0;
    q[0]=1;
    while(ls<=ld)
    {
        x=q[ls++];
        for(it=l[x].begin();it!=l[x].end();++it)
            if(!viz[*it] && cap[x][*it]>flux[x][*it])
                viz[*it]=1, d[*it]=x, q[++ld]=*it;
    }
    if(d[n])
        return 1;
    else
        return 0;
}

int main()
{
    fin>>n>>m;
    for(i=1;i<=m;++i)
        fin>>x>>y>>c,
        l[x].push_back(y),
        cap[x][y]=c;
    while(bf())
    {
        minn=INF;
        for(i=n;i!=1;i=d[i])
            if((cap[d[i]][i]-flux[d[i]][i])<minn)
                minn=cap[d[i]][i]-flux[d[i]][i];
        for(i=n;i!=1;i=d[i])
            flux[d[i]][i]+=minn;
        maxflow+=minn;
    }
    fout<<maxflow;
    return 0;
}