Cod sursa(job #1228717)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 15 septembrie 2014 01:15:36
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

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

vector <int> l[1010];

void dfs (int nod) {

    t[nod]=-1;
    int x;
    for (int i=0;i<l[nod].size();i++) {
        x=l[nod][i];
        if (t[x]==0 && c[nod][x]>f[nod][x]){
            dfs(x);
            t[x]=nod;
        }
    }
}

int main () {

    fin>>n>>m;

    while (m--) {
        fin>>x>>y>>C;
        l[x].push_back(y);
        l[y].push_back(x);
        c[x][y]=C;
    }
    dfs(1);
    while (t[n]){
        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){
                    minim=min(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;
            }
        }
        memset(t,0,sizeof(t));
        dfs(1);
    }

    fout<<sol<<"\n";

    return 0;
}