Cod sursa(job #952752)

Utilizator misinozzz zzz misino Data 23 mai 2013 22:05:55
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<fstream>
#define N 1010
#define INF 999999999
#include<vector>
#include<cstring>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int fluxt,fluxm,i,n,m,x,y,cost,c[N][N],fl[N][N],t[N];
vector<int>l[1010];
bool viz[1010];
inline int bfs()
{
    int p,u,q[1010];

    memset(viz,0,sizeof(viz));
    q[1]=1;
    p=u=1;
    viz[1]=1;
    while(p<=u)
    {
        x=q[p];
        ++p;
        if(x==n)
        continue;
        for(i=0;i<l[x].size();++i)
        {
            y=l[x][i];
            if(viz[y]||c[x][y]==fl[x][y])
            continue;
            else
            {
                ++u;
                q[u]=y;
                t[y]=x;
                viz[y]=1;
            }
        }
    }
    return !viz[n];
}
int main()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
    {
        f>>x>>y>>cost;
        c[x][y]+=cost;
        l[x].push_back(y);
        l[y].push_back(x);
    }
    while(1)
    {
        if(bfs())
        break;
        for(i=0;i<l[n].size();++i)
        {
            x=l[n][i];
            if(fl[x][n]==c[x][n]||!viz[x])
            continue;
            t[n]=x;
            fluxm=INF;
            x=n;
            while(x!=1)
            {
                fluxm=min(fluxm,c[t[x]][x]-fl[t[x]][x]);
                x=t[x];
            }
            if(fluxm==0)
            continue;
            x=n;
            while(x!=1)
            {
                fl[t[x]][x]+=fluxm;
                fl[x][t[x]]-=fluxm;
                x=t[x];
            }
            fluxt+=fluxm;
        }
    }
    g<<fluxt<<'\n';
    return 0;
}