Cod sursa(job #607015)

Utilizator theodora_maneaManea Theodora Maria theodora_manea Data 10 august 2011 16:42:01
Problema Flux maxim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int t[1001],fl,s,d,c[1001][1001],f[1001][1001],m,n,x,y,z,i;
int min(int a,int b) {
    if (a>b) return b;
    else return a;
}
int bf (int s,int d) {
int st,dr,nod,i,q[100];
st=1;
dr=1;
q[1]=s;
memset (t,0,sizeof(t));
t[s]=-1;
while (st<=dr) {
    nod=q[st];
    for (i=1;i<=n;i++)
        if (!t[i] && c[nod][i]>f[nod][i]) {
            dr++;
            q[dr]=i;
            t[i]=nod;
            if (i==d) return 1;
        }
st++;
}
return 0;
}
void flux () {
int i,j,r;
fl=0;
while (bf(s,d)) {
    for (i=1;i<=n;i++) {
        if (t[i]==-1 || c[i][d]<=f[i][d])
            continue;
        r=c[i][d]-f[i][d];
        j=i;
        while (j!=s && j) {
            r=min(r,c[t[j]][j]-f[t[j]][j]) ;
            j=t[j];
        }
        if (r==0)
            continue;
        j=i;
        f[i][d]+=r;
        f[d][i]-=r;
        while (j!=s && j) {
            f[t[j]][j]+=r;
            f[j][t[j]]-=r;
            j=t[j];
        }
    fl=fl+r;
}
}
}
int main() {
    in>>n>>m;
    for (i=1;i<=m;i++) {
        in>>x>>y>>z;
        c[x][y]=z;
    }
    s=1;
    d=n;
    flux();
    out<<fl;
    return 0;
}