Cod sursa(job #1309882)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 6 ianuarie 2015 10:02:27
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<cstdio>
#include<vector>
#include<cstring>

using namespace std;

vector<int> g[1002];
vector<int>::iterator it;
int n,t[1002],m,flow,fmin,c[1002][1002],f[1002][1002],start,x,y,z,i,cd[5002];
bool sel[1002];

bool bf()
{
    int i,nod,v;
    vector<int>::iterator j;
    cd[0]=1;
    cd[1]=1;
    memset(sel,0,sizeof(sel));
    sel[1]=true;
    for(i=1;i<=cd[0];i++)
    {
        nod=cd[i];
        if(nod==n)
        {
            continue;
        }
        for(j=g[nod].begin();j!=g[nod].end();j++)
        {
            if(sel[*it]||c[nod][*it]==f[nod][*it])
            {
                continue;
            }
            cd[++cd[0]]=*it;
            sel[*it]=true;
            t[*it]=nod;
        }
    }
    return sel[n];
}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        c[x][y]+=z;
        g[x].push_back(y);
        g[y].push_back(x);
    }
    while(bf)
    {
        for(it=g[n].begin();it!=g[n].end();it++)
        {
            start=(*it);
            if(f[start][n]==c[start][n]||!sel[start])
            {
                continue;
            }
            t[n]=start;
            fmin=122361287;
            for(start=n;start!=1;start=t[start])
            {
                fmin=min(fmin,c[t[start]][start]-f[t[start]][start]);
            }
            if(fmin==0)
            {
                continue;
            }
            for(start=n;start!=1;start=t[start])
            {
                f[t[start]][start]+=fmin;
                f[start][t[start]]-=fmin;
            }
            flow+=fmin;
        }
    }
    printf("%d\n",flow);
}