Cod sursa(job #1168303)

Utilizator smaraldaSmaranda Dinu smaralda Data 7 aprilie 2014 22:11:38
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include<stdio.h>
#include<vector>
#include<string.h>
#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(!vis[*it] && cap[node][*it] > flow[node][*it])
                if(!vis[*it]) {
                    vis[*it] = 1;
                    if(*it != n )
                        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;
    vector <int> :: iterator it;

    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()) {

        for(it = graph[n].begin(); it != graph[n].end(); ++ it) {
            if(!vis[*it])
                continue;
            dad[n] = *it;
            minFlow = INF;
            i = *it;
            while(i != 1) {
                minFlow = min(minFlow, cap[dad[i]][i] - flow[dad[i]][i]);
                i = dad[i];
            }

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

            ans += minFlow;
        }
    }

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