Cod sursa(job #626040)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 26 octombrie 2011 10:40:01
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
#include<queue>
#define N 1001
using namespace std;

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

int n,m,x[N][N],maxflow,p[N];

int bf() {
    queue<int> q;
    bool ver[N];
    int i;

    for(i=1;i<=n;++i)
        ver[i]=false;

    q.push(1);

    while(!q.empty()) {

        for(i=1;i<=n;++i) if(!ver[i] && x[q.front()][i]>0) {

            ver[i]=true;

            p[i]=q.front();

            if(i==n)
                return 1;

            q.push(i);

        }

        q.pop();

    }

    return 0;

}

bool drum() {
    int t,smin=1<<22;

    if(bf()==0)
        return false;

    t=n;
    while(t!=1) {

        if(x[p[t]][t]<smin)
            smin=x[p[t]][t];

        t=p[t];
    }

    t=n;
    while(t!=1) {

        x[p[t]][t]-=smin;
        x[t][p[t]]+=smin;

        t=p[t];

    }

    maxflow+=smin;

    return true;

}


int main() {
    int i,j,a,b,c;

    in >> n >> m;

    for(i=1;i<=n;++i)
        for(j=1;j<=n;++j)
            x[i][j]=-1;

    for(i=1;i<=m;++i) {

        in >> a >> b >> c;

        if(x[a][b]==-1)
            x[a][b]=0;
        if(x[b][a]==-1)
            x[b][a]=0;

        x[a][b]+=c;

    }

    while(drum());

    out << maxflow;

    return 0;
}