Cod sursa(job #1051511)

Utilizator gogol100vrabie gelu gogol100 Data 10 decembrie 2013 10:25:54
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int cap[1024][1024],pred[1024],q[1024];
vector <int> vec[1024];
void bfs(int s,int t)
{
    int start=0,avans=0;
    q[avans++]=s;
    pred[s]=-2;
    while(avans>start && pred[t]==-1)
        for(int u=q[start++],i=0,v;i<vec[u].size();i++)
        {
            v=vec[u][i];
            if(pred[v]==-1 && cap[u][v])
                q[avans++]=v,pred[v]=u;
        }
}
int dinic(int n,int s,int t){
    int fl=0;
    while(1)
    {
        memset(pred,-1,sizeof(pred));
        bfs(s,t);
        if(pred[t]==-1) break;
        for(int z=1;z<=n;z++)
            if(cap[z][t] && pred[z]!=-1)
            {
                int capmin=cap[z][t];
                for(int v=z,u=pred[v];u>0;v=u,u=pred[v])
                    capmin=min(capmin,cap[u][v]);
                if(!capmin) continue;
                cap[z][t]-=capmin;cap[t][z]+=capmin;
                for(int v=z,u=pred[v];u>=0;v=u,u=pred[v])
                {    cap[u][v]-=capmin;cap[v][u]+=capmin;}
                fl+=capmin;
            }
    }
    return fl;
}
int main()
{
    int n,s,t,m;
    cin>>n>>m;
    s=1;t=n;
    for(int i=0;i<m;i++)
    {
        int u,v,c;
        cin>>u>>v>>c;
        cap[u][v]+=c;
        vec[u].push_back(v);
        vec[v].push_back(u);
    }
    cout<<dinic(n,s,t);
    return 0;
}