Cod sursa(job #1147358)

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

bitset<N> 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);
        while (!b.empty()) {
            int u = b.front();b.pop();
            viz[u] = true;
            for (int i=0;i<G[u].size();i++) {
                if (!viz[G[u][i]] && a[u][G[u][i]]>0) {
                    b.push(G[u][i]);
                    parent[G[u][i]] = u;
                }
            }
        }
        
        
        if (!viz[t])
            break;
        
        for (int i=0;i<G[t].size();i++) {
            if (viz[G[t][i]] && a[G[t][i]][t]>0) {
                parent[t] = G[t][i];
                augment_path(t, INF);
                mf+=f;
            }
        }
    }
    
    out<<mf;
    
    return 0;
}