Cod sursa(job #331815)

Utilizator freak93Adrian Budau freak93 Data 15 iulie 2009 13:26:57
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<fstream>
#include<vector>
#include<cstring>

using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

const int maxn=1005;
const int INF=0x3f3f3f3f;

vector<int>a[maxn];

int F[maxn][maxn],C[maxn][maxn];

int i,j,n,m,x,y,z,par[maxn];

bool been[maxn];

int coada[maxn];

bool bfs()
{
    int x;
    memset(been,false,sizeof(been));
    been[1]=1;
    par[1]=0;
    int elem=1;
    coada[1]=1;
    int i;
    for(i=1;i<=elem;++i)
    {
        x=coada[i];
        if(x==n)
            continue;
        for(vector<int>::iterator it=a[x].begin();it!=a[x].end();++it)
            if(been[*it]==false&&F[x][*it]!=C[x][*it])
                coada[++elem]=*it,been[*it]=true,par[*it]=x;
    }
    return been[n];
}

int main()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>z;
        C[x][y]+=z;
        a[x].push_back(y);
        a[y].push_back(x);
    }

    int flow,fmin;
    for(flow=0;bfs();)
        for(vector<int>::iterator it=a[n].begin();it!=a[n].end();++it)
        {
            if(F[*it][n]==C[*it][n]||been[*it]==false)
                continue;
            fmin=INF;
            par[n]=*it;
            for(i=n;i!=1;i=par[i])
                fmin=min(fmin,C[par[i]][i]-F[par[i]][i]);
            if(fmin==0)
                continue;
            for(i=n;i!=1;i=par[i])
                F[par[i]][i]+=fmin,F[i][par[i]]-=fmin;
            flow+=fmin;
        }
    g<<flow<<"\n";
    f.close();
    g.close();

    return 0;
}