Cod sursa(job #1246636)

Utilizator RynaquiAxinte Silviu Rynaqui Data 21 octombrie 2014 14:18:24
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define N 1010
using namespace std;
vector<int> v[N];
int n,i,j,m,C[N][N],F[N][N],T[N],Q[N],sol,top,bottom;
void upd();
bool BF();
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(;m;m--)
    {
        scanf("%d%d",&i,&j);
        scanf("%d",&C[i][j]);
        v[i].push_back(j);
        v[j].push_back(i);
    }
    for(;BF();)
        upd();
    printf("%d\n",sol);
    return 0;
}
bool BF()
{
    int x;
    top=bottom=1;
    for(i=1;i<=n;i++)T[i]=0;
    T[1]=1;Q[1]=1;
    for(;top>=bottom;)
    {
        x=Q[bottom++];
        for(vector<int>::iterator it=v[x].begin();it!=v[x].end();it++)
            if(!T[*it]&&C[x][*it]-F[x][*it]>0)
            {
                Q[++top]=*it;
                T[*it]=x;
                if(*it==n)return 1;
            }
    }
    return T[n];
}
void upd()
{
    int fl=1<<30;
    for(i=n,j=T[n];i!=j;i=T[i],j=T[j])
        fl=min(fl,C[j][i]-F[j][i]);
    sol+=fl;
    for(i=n,j=T[n];i!=j;i=T[i],j=T[j])
    {
        F[j][i]+=fl;
        F[i][j]-=fl;
    }
}