Cod sursa(job #929978)

Utilizator misinozzz zzz misino Data 27 martie 2013 13:08:55
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include<fstream>
#include<vector>
#include<cstring>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int mini,i,s,j,d,x,y,z,n,flux,m,t[1010],q[1010],c[1010][1010],fl[1010][1010];
vector<int>l[1010];
int bfs()
{
    int i,x,p=1,u=1;
    q[1]=s;
    memset(t,0,sizeof(t));
    t[s]=-1;
    while(p<=u)
    {
        x=q[p];
        ++p;
        for(i=0;i<l[x].size();++i)
        if(!t[l[x][i]]&&c[x][l[x][i]]>fl[x][l[x][i]])
        {
            ++u;
            q[u]=l[x][i];
            t[l[x][i]]=x;
            if(l[x][i]==d)
            return 1;
        }
    }
    return 0;
}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>z;
        l[x].push_back(y);
        c[x][y]=z;
    }
    s=1;
    d=n;
    while(bfs())
    {
        for(j=1;j<=n;++j)
        if(c[j][n]!=fl[j][n]&&t[j])
        {
            t[n]=j;
            i=d;
            mini=999999999;
            while(i!=s)
            {
                mini=min(mini,c[t[i]][i]-fl[t[i]][i]);
                i=t[i];
            }
            if(mini==0)
            continue;
            i=d;
            while(i!=s)
            {
                fl[t[i]][i]+=mini;
                fl[i][t[i]]-=mini;
                i=t[i];
            }
            flux+=mini;
        }
    }
    g<<flux<<'\n';
    return 0;
}