Cod sursa(job #333971)

Utilizator levap1506Gutu Pavel levap1506 Data 24 iulie 2009 19:16:16
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <fstream>
#include <queue>
#define INF INT_MAX
using namespace std;
struct node {
    int vertex,from;
};
node nodez (int a, int c) {
    node my;
    my.vertex=a;
    my.from=c;
    return (my);
}
node mynod;
queue<node> q;
int N,M,from[1010],visit[1010],capacity[1010][1010],a,b,i,c;
vector<int> vecin[1010];
vector<int>::iterator it;
bool BFS(){
     memset(visit, 0, sizeof(visit));
    int where;
    q.push(nodez(1,-1));
    while (!q.empty()) {
        mynod=q.front();
        q.pop();
        where=mynod.vertex;
        if (visit[where]) continue;
        from[where]=mynod.from;
        if (where==N) {visit[N]=1;  continue;}
        visit[where]=1;
        for (it=vecin[where].begin();it!=vecin[where].end();it++) {
            if (capacity[where][*it]>0) q.push(nodez(*it,where));
        }
    }
    return visit[N];
}
int main () {
    ifstream in;
    ofstream out;
    in.open("maxflow.in");
    out.open("maxflow.out");
    in >> N >> M;
    for (i=0;i<M;i++) {
        in >> a >> b >> c;
        vecin[a].push_back(b);
        vecin[b].push_back(a);
        capacity[a][b]=c;
    }
    int sum=0,m=INF,nod;
     for(m=0;BFS();)
      for (it=vecin[N].begin();it!=vecin[N].end();it++) {
        nod=*it;
        if (capacity[nod][N]==0||from[nod]==0) continue;
        from[N]=nod;
        m=INF;
        nod=N;
        while (from[nod]>0) {
            m=min(m,capacity[from[nod]][nod]);
            nod=from[nod];
        }
        if (!m) continue;
        nod=N;
        while (from[nod]>0) {
            capacity[from[nod]][nod]-=m;
            capacity[nod][from[nod]]+=m;
            nod=from[nod];
        }
        sum+=m;
      }
     out << sum;
     out.close();
    return 0;
}