Cod sursa(job #1027412)

Utilizator dariusdariusMarian Darius dariusdarius Data 12 noiembrie 2013 19:34:35
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
int F[1005][1005];
int C[1005][1005];
int N,M,p[1005];
queue<int> q;
vector<int> G[1005];
bool is_path()
{
    memset(p,0,sizeof(p));
    q.push(1);p[1]=-1;
    while(!q.empty())
    {
        for(vector<int>::iterator it=G[q.front()].begin();it!=G[q.front()].end();it++)
            if(!p[*it] && F[q.front()][*it]<C[q.front()][*it])
            {
                q.push(*it);
                p[*it]=q.front();
            }
        q.pop();
    }
    if(!p[N])
        return false;
    return true;
}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(int x,y,c,i=1;i<=M;i++)
    {
        scanf("%d%d%d",&x,&y,&c);
        C[x][y]=c;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    int total=0;
    while(is_path())
    {
        int u=N,flux=1000000000;
        while(u!=1)
        {
            flux=min(flux,C[p[u]][u]-F[p[u]][u]);
            u=p[u];
        }
        u=N;
        while(u!=1)
        {
            F[p[u]][u]+=flux;
            F[u][p[u]]-=flux;
            u=p[u];
        }
        total+=flux;
    }
    printf("%d\n",total);
    return 0;
}