Cod sursa(job #1207037)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 11 iulie 2014 21:41:15
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<fstream>
#include<cstring>
#include <vector>

using namespace std;

ifstream fin ("maxflow.in");
ofstream fout("maxflow.out");

int t[1010],q[1010],c[1010][1010],f[1010][1010];
int n,i,x,y,z,u,p,sol,minim,m;

vector <int> l[1010];

int bfs() {

    memset(t,0,sizeof(t));
    t[1]=-1;
    p=u=q[1]=1;

    while (p<=u) {
        x=q[p];
        for (int i=0;i<l[x].size();i++) {
            y=l[x][i];
            if (t[y]==0 && c[x][y]>f[x][y]) {
                q[++u]=y;
                t[y]=x;
            }
        }
        p++;
    }
    return t[n];
}


int main () {

    fin>>n>>m;

    for (i=1;i<=m;i++) {
        fin>>x>>y>>z;
        l[x].push_back(y);
        l[y].push_back(x);
        c[x][y]=z;
    }

    while (bfs()) {

        for (i=0;i<l[n].size();i++) {
            x=l[n][i];
            if (t[x]!=0 && c[x][n]>f[x][n]){
                minim=c[x][n]-f[x][n];
                while (t[x]!=-1){
                    if (minim>c[t[x]][x]-f[t[x]][x])
                        minim=c[t[x]][x]-f[t[x]][x];
                    x=t[x];
                }
                x=l[n][i];
                f[x][n]+=minim;
                f[n][x]-=minim;
                while (t[x]!=-1){
                    f[t[x]][x]+=minim;
                    f[x][t[x]]-=minim;
                    x=t[x];
                }
                sol+=minim;
            }
        }



    }

    fout<<sol<<"\n";

    return 0;
}