Cod sursa(job #717279)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 19 martie 2012 19:47:49
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <deque>
#define N 1010
#define INF 999999999
#define M 5010

using namespace std;

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

int n,i,j,m,x,y,c,C[N][N],F[N][N],PR[N],ANS=0,fmin=0;
vector <int> A[N];
bool V[N];
deque<int> Q;

bool BFS(){
    int nod;
    memset(V,0,sizeof(V));
    Q.clear();
    Q.push_back(1);V[1]=1;
    while (!Q.empty()) {
        nod=Q.front();Q.pop_front();
        for (int j=0;j<A[nod].size();j++)
            if (!V[A[nod][j]] && C[nod][A[nod][j]]!=F[nod][A[nod][j]]) {
                V[A[nod][j]]=1;
                PR[A[nod][j]]=nod;
                Q.push_back(A[nod][j]);
            }
    }
    return V[n];
}

int main() {
    f >> n >> m;
    for (i=1;i<=m;i++) {
        f >> x >> y >> c;
        C[x][y]=c;
        A[x].push_back(y);
        A[y].push_back(x);
    }
   for (ANS=0;BFS();ANS+=fmin) {
        fmin=INF;
        for (i=n;i>1;i=PR[i]) fmin=min(fmin,C[PR[i]][i]-F[PR[i]][i]);
        for (i=n;i>1;i=PR[i]) F[PR[i]][i]+=fmin,F[i][PR[i]]-=fmin;
    }
    g << ANS << '\n';
    f.close();g.close();
    return 0;
}