Cod sursa(job #731356)

Utilizator test0Victor test0 Data 7 aprilie 2012 22:14:45
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#define INF 0x7FFFFFFF
using namespace std;
#define MAX 1001
vector<int>U[MAX];
int C[MAX][MAX],F[MAX][MAX],n,m;
int c[MAX],tt[MAX],viz[MAX],k;

//debug
void pr(int c[][MAX]){
    for(int i=1;i<=n;i++){
    for(int j=1;j<=n;j++)printf("%d ",c[i][j]); printf("\n"); }
}

bool bfs(){
    int i=1,j,x;
    memset(viz,0,sizeof(viz));
    c[k=1]=viz[1]=1;
    while(i<=k){
        x=c[i];
        for(j=0;j<U[x].size();j++)
        if(!viz[U[x][j]]&&C[x][U[x][j]]!=F[x][U[x][j]]){
            viz[U[x][j]]=1;
            c[++k]=U[x][j];
            tt[U[x][j]]=x;
            if(U[x][j]==n)return 1; }
        i++; }
    return 0;
}

int main(){
    int x,y,z,flux=0;
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
        scanf("%d %d",&n,&m);
        for(int i=1;i<=m;i++){
            scanf("%d %d %d",&x,&y,&z);
            C[x][y]=z;
            U[x].push_back(y);
            U[y].push_back(x); }
        for(;bfs();){
            x=INF;
            for(y=n;y!=1;y=tt[y])x=min(x,C[tt[y]][y]-F[tt[y]][y]);
            flux+=x;
            for(y=n;y!=1;y=tt[y]){
                F[tt[y]][y]+=x;
                F[y][tt[y]]-=x; } }
    printf("%d\n",flux);
}