Cod sursa(job #1168294)

Utilizator smaraldaSmaranda Dinu smaralda Data 7 aprilie 2014 21:27:40
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;

const int NMAX = 1000, INF = 2e9;

vector <int> graph[NMAX + 5];
queue <int> q;
int n, dad[NMAX + 1], cap[NMAX + 1][NMAX + 1], flow[NMAX + 1][NMAX + 1];
bool vis[NMAX + 1];

int bfs () {
    int node;
    vector <int> :: iterator it;

    memset(vis, 0, sizeof(vis));
    memset(dad, 0, sizeof(dad));
    while(!q.empty())   q.pop();

    q.push(1);
    vis[1] = 1;
    while(!q.empty()) {
        node = q.front();
        q.pop();

        for(it = graph[node].begin(); it != graph[node].end(); ++ it)
            if(cap[node][*it] > flow[node][*it])
                if(!vis[*it])
                    vis[*it] = 1,
                    q.push(*it),
                    dad[*it] = node;

        if(vis[n])
            return 1;
    }

    return 0;
}

int main() {
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int i, m, a, b, c, ans, minFlow;

    scanf("%d%d", &n, &m);
    for(i = 1; i <= m; ++ i) {
        scanf("%d%d%d", &a, &b, &c);
        graph[a].push_back(b);
        graph[b].push_back(a);
        cap[a][b] = c;
    }

    ans = 0;
    while(bfs()) {
        minFlow = INF;

        i = n;
        while(i != 1) {
            minFlow = min(minFlow, cap[dad[i]][i] - flow[dad[i]][i]);
            i = dad[i];
        }

        i = n;
        while(i != 1) {
            flow[dad[i]][i] += minFlow;
            flow[i][dad[i]] -= minFlow;
            i = dad[i];
        }

        ans += minFlow;
    }

    printf("%d\n", ans);
    return 0;
}