Cod sursa(job #738906)

Utilizator test0Victor test0 Data 21 aprilie 2012 19:03:26
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#define MAX 1001
#define INF 0xfffff
using namespace std;
vector<int>u[MAX];
int c[MAX][MAX],f[MAX][MAX],n,m,tata[MAX],cd[MAX],k;
bool viz[MAX];

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

void flux_max(){
    int flux=0,fmin,x;
    while(bfs()){
        for(int i=0;i<u[n].size();i++){
        x=u[n][i];
    if(viz[x]&&f[x][n]<c[x][n]){
        tata[n]=x;
        fmin=INF;
        for(x=n;x!=1;x=tata[x])
        fmin=min(fmin,c[tata[x]][x]-f[tata[x]][x]);
    if(fmin==0)continue;
    flux+=fmin;
        for(x=n;x!=1;x=tata[x]){
            f[tata[x]][x]+=fmin;
            f[x][tata[x]]-=fmin;}
    } }
    }
    printf("%d\n",flux);
}

int main(){
    int x,y,z;
    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);
        }
    flux_max();
}