Cod sursa(job #1233609)

Utilizator j.loves_rockJessica Joanne Patrascu j.loves_rock Data 25 septembrie 2014 19:31:51
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

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

vector <int> l[1010];

bool bfs (int nod) {

    int p,u;

    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]==0?0:1);
}

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;
    }

    while (bfs(1)){
        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));
    }

    fout<<sol<<"\n";

    return 0;
}