Cod sursa(job #1147376)

Utilizator mihaiSimuSimu Mihai mihaiSimu Data 19 martie 2014 19:38:54
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <iostream>
#include <bitset>
#include <vector>
#include <queue>
#define N 1003
#define INF 110005000
using namespace std;

bitset<1003> viz;
vector<int> G[N];
int a[N][N];
int n,m,s,t;
int parent[N];
int f;


void augment_path(int u, int maxEdge) {
    if (u==s) {
        f = maxEdge;
    }
    else {
        augment_path(parent[u], min(maxEdge, a[parent[u]][u]));
        a[parent[u]][u]-=f;
        a[u][parent[u]]+=f;
    }
}

int main() {
    int x,y,c;
    ifstream in("maxflow.in");
    ofstream out("maxflow.out");
    
    in>>n>>m;
    s=1;t=n;
    
    for(int i=0;i<m;i++) {
        in>>x>>y>>c;
        a[x][y] = c;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    int mf = 0;
    while (true) {
        viz.reset();
        queue<int> b;
        b.push(s);
        viz[s] = true;
        while (!b.empty()) {
            int u = b.front();b.pop();
            for (int i=0;i<G[u].size();i++) {
                int v = G[u][i];
                if (!viz[v] && a[u][v]>0) {
                    b.push(v);
                    viz[v] = true;
                    parent[v] = u;
                }
            }
        }
        
        
        if (!viz[t])
            break;
        
        for (int i=0;i<G[t].size();i++) {
            int u = G[t][i];
            if (viz[u] && a[u][t]>0) {
                parent[t] = u;
                augment_path(t, INF);
                mf+=f;
            }
        }
    }
    out<<mf;
    
    return 0;
}