Cod sursa(job #1491423)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 25 septembrie 2015 12:25:55
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<cstdio>
#include<vector>
#include<cstring>

using namespace std;

vector<int> g[10002];
vector<int> cd;
vector<int>::iterator it;
int n,t[10002],ans,mn,x,y,m,i,c[1002][1002],f[1002][1002],nod;
bool sel[1002];

bool bf()
{
    int i,nod;
    vector<int>::iterator j;
    cd.push_back(1);
    memset(sel,false,sizeof(sel));
    sel[1]=true;
    for(i=0;i<cd.size();i++)
    {
        x=cd[i];
        if(x==n)
        {
            continue;
        }
        for(j=g[nod].begin();j!=g[nod].end();j++)
        {
            if(!sel[*j]||c[nod][*j]==f[nod][*j])
            {
                continue;
            }
            cd.push_back(*j);
            sel[*j]=nod;
            t[*j]=nod;
        }
    }
    cd.clear();
    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",&x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    while(bf())
    {
        for(it=g[n].begin();it!=g[n].end();it++)
        {
            nod=*it;
            if(f[nod][n]==c[nod][n]||!sel[nod])
            {
                continue;
            }
            t[n]=nod;
            mn=2136732;
            for(nod=n;nod!=1;nod=t[nod])
            {
                mn=min(mn,c[t[nod]][nod]-f[t[nod]][nod]);
            }
            if(mn==0)
            {
                continue;
            }
            for(nod=n;nod!=1;nod=t[nod])
            {
                f[t[nod]][nod]+=mn;
                f[nod][t[nod]]-=mn;
            }
            ans+=mn;
        }
    }
    printf("%d\n",ans);
    return 0;
}