Cod sursa(job #1393982)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 19 martie 2015 21:45:59
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>
#include <vector>
#include <queue>
#define Nmax 1005
#define INF 2000000000

using namespace std;

int n,prev[Nmax],C[Nmax][Nmax],F[Nmax][Nmax];
bool viz[Nmax];
vector <int> L[Nmax];
queue <int> Q;

inline bool Bfs()
{
    int i,nod;
    vector <int> ::iterator it;
    Q.push(1); viz[1]=true;
    for(i=2;i<=n;++i) viz[i]=false;
    while(!Q.empty())
    {
        nod=Q.front(); Q.pop();
        if(nod==n) continue;
        for(it=L[nod].begin();it!=L[nod].end();++it)
            if(!viz[*it] && F[nod][*it]<C[nod][*it])
            {
                prev[*it]=nod; viz[*it]=true;
                Q.push(*it);
            }
    }
    return viz[n];
}

int main()
{
    int m,x,y,z,i,flow=0,minflow;
    freopen ("maxflow.in","r",stdin);
    freopen ("maxflow.out","w",stdout);
    scanf("%d%d", &n,&m);
    while(m--)
    {
        scanf("%d%d%d", &x,&y,&z);
        L[x].push_back(y);
        L[y].push_back(x);
        C[x][y]=z; C[y][x]=0;
    }
    while(Bfs())
    {
        minflow=INF;
        for(i=n;i>1;i=prev[i]) minflow=min(minflow,C[prev[i]][i]-F[prev[i]][i]);
        flow+=minflow;
        for(i=n;i>1;i=prev[i])
        {
            F[prev[i]][i]+=minflow;
            F[i][prev[i]]-=minflow;
        }
    }
    printf("%d\n", flow);
    return 0;
}