Cod sursa(job #1971175)

Utilizator RaTonAndrei Raton RaTon Data 19 aprilie 2017 22:01:45
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
#define Max 1001
#define inf 1e9
int n, m;
int graph[Max][Max];
int rgraph[Max][Max];
int parent[Max];
bool bfs(int s, int t){
    bool visited[Max];
    for(int i = 0; i < n; i++ )
        visited[i] = false;
    queue <int> q;
    q.push(s);
    visited[s] = true;
    parent[s] = -1;
    while (!q.empty()){
        int u = q.front();
        q.pop();
        for (int v = 0; v < n; v++){
            if (visited[v] == false && rgraph[u][v] > 0){
                q.push(v);
                parent[v] = u;
                visited[v] = true;
            }
        }
    }
    return (visited[t] == true);
}

int fordFulkerson(int s, int t)
{
    int max_flow, u, v;
    max_flow = 0;
    while (bfs(s, t)){
        int path_flow = inf;
        for (v = t; v != s; v = parent[v]){
            u = parent[v];
            path_flow = min(path_flow, rgraph[u][v]);
        }
        for (v = t; v != s; v = parent[v]){
            u = parent[v];
            rgraph[u][v] -= path_flow;
            rgraph[v][u] += path_flow;
        }
        max_flow += path_flow;
    }
    return max_flow;
}
int main()
{
    int x, y;
    f >> n >> m;
    for(int i = 0; i < m; i++){
        f >> x >> y;
        x--;y--;
        f >> graph[x][y];
        rgraph[x][y] = graph[x][y];
    }
    g << fordFulkerson(0,n-1);
    return 0;
}