Cod sursa(job #1042367)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 26 noiembrie 2013 22:31:47
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <string>
#include <ctime>
#include <cassert>
#include <utility>

using namespace std;

#define INF 1000000000
#define MAXN 1005

int N, M, x, y, z, ans;
vector<int> A[MAXN];
int cap[MAXN][MAXN];
bool v[MAXN];

int dfs(int node, int c) {
    v[node] = true;
    if(node == N) {
        ans += c;
        return c;
    }

    int x = 0;
    for(vector<int> :: iterator it = A[node].begin(); it != A[node].end() && x == 0; it++) {
        if(!v[*it] && cap[node][*it] > 0 && (x = dfs(*it, min(c, cap[node][*it])))) {
            cap[node][*it] -= x;
            cap[*it][node] += x;
        }
    }

    return x;
}

int main() {
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out","w", stdout);

    scanf("%d %d", &N, &M);
    for(int i = 0; i < M; i++) {
        scanf("%d %d %d", &x, &y, &z);
        A[x].push_back(y);
        A[y].push_back(x);
        cap[x][y] += z;
    }

    ans = 0;
    while(dfs(1, INF)) {
        memset(v, false, sizeof(v));
    }

    printf("%d\n", ans);

	return 0;
}