Cod sursa(job #1588321)

Utilizator livliviLivia Magureanu livlivi Data 2 februarie 2016 22:58:19
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<cstdio>
#include<bitset>
#include<queue>
#define N 1000
#define M 5000
using namespace std;

int c[N+1][N+1];
int f[N+1][N+1];
int n;

bitset<N+1> viz;
int tata[N+1];
int R;

int minim(int a,int b){
    return (a<b) ? a : b;
}

bool bfs(){
    viz.reset();

    int nod,i;
    queue<int> q;

    q.push(1);
    viz.set(1);

    while(!q.empty()){
        nod=q.front();
        q.pop();

        for(i=1;i<=n;i++)
            if (c[nod][i]-f[nod][i]>0 &&viz[i]==false){
                viz.set(i);
                tata[i]=nod;
                q.push(i);
            }
    }

    return viz[n];
}

void solve(){
    int i,min;

    while(bfs()){
        for(i=1;i<n;i++)
            if (c[i][n]-f[i][n]!=0 &&viz[i]==true){
                tata[n]=i;

                int nod=n;
                min=c[tata[nod]][nod]-f[tata[nod]][nod];
                while(nod!=1){
                    min=minim(min,c[tata[nod]][nod]-f[tata[nod]][nod]);
                    nod=tata[nod];
                }

                R+=min;
                nod=n;
                while(nod!=1){
                    f[tata[nod]][nod]+=min;
                    f[nod][tata[nod]]-=min;
                    nod=tata[nod];
                }
            }
    }
}


int main(){
    freopen ("maxflow.in","r",stdin);
    freopen ("maxflow.out","w",stdout);
    int m,i,x,y;

    scanf ("%d%d",&n,&m);
    for(i=1;i<=m;i++){
        scanf ("%d%d",&x,&y);
        scanf ("%d",&c[x][y]);
    }

    solve();

    printf ("%d",R);
    return 0;
}