Cod sursa(job #629306)

Utilizator valentin.harsanValentin Harsan valentin.harsan Data 3 noiembrie 2011 09:45:14
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<fstream>
#include<queue>
#include<vector>
#define N 1001
using namespace std;

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

int n,m,x[N][N],p[N],flux[N][N];
vector<int> g[N];

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

    for(i=1;i<=n;++i) {
        ver[i]=false;
        p[i]=0;
    }

    q.push(1);

    while(!q.empty()) {

        for(i=0;i!=g[q.front()].size();++i) if(!ver[g[q.front()][i]] && x[q.front()][g[q.front()][i]]-flux[q.front()][g[q.front()][i]]>0) {

            ver[g[q.front()][i]]=true;

            p[g[q.front()][i]]=q.front();

            q.push(g[q.front()][i]);

        }

        q.pop();

    }

    if(p[n])
        return true;
    return false;
}

int dinic() {
    int smin,maxflow=0,j,i;

    while(bf()) {

        for(j=1;j!=n;++j) if(x[j][n] - flux[j][n]>0) {

            smin=1<<22;

            if(x[j][n] - flux[j][n]<smin)
                smin=x[j][n] - flux[j][n];

            for(i=j;i!=1;i=p[i])
                if(x[p[i]][i] - flux[p[i]][i]<smin)
                    smin=x[p[i]][i] - flux[p[i]][i];

            flux[j][n]+=smin;
            flux[n][j]-=smin;

            for(i=j;i!=1;i=p[i]) {

                flux[p[i]][i]+=smin;
                flux[i][p[i]]-=smin;

            }

            maxflow+=smin;
        }

    }

    return maxflow;

}

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

    in >> n >> m;

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

        in >> a >> b >> c;

        x[a][b]+=c;

        g[a].push_back(b);
        g[b].push_back(a);

    }

    out << dinic();

    return 0;
}