Cod sursa(job #1027421)

Utilizator dariusdariusMarian Darius dariusdarius Data 12 noiembrie 2013 19:39:08
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 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())
    {
        if(q.front()==N)
        {
            q.pop();
            continue;
        }
        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())
        for(vector<int>::iterator it=G[N].begin();it!=G[N].end();it++)
        {
            int u=*it,flux=C[*it][N]-F[*it][N];
            while(u!=1)
            {
                flux=min(flux,C[p[u]][u]-F[p[u]][u]);
                u=p[u];
            }
            u=*it;
            F[*it][N]+=flux;
            F[N][*it]-=flux;
            while(u!=1)
            {
                F[p[u]][u]+=flux;
                F[u][p[u]]-=flux;
                u=p[u];
            }
            total+=flux;
        }
    printf("%d\n",total);
    return 0;
}