Cod sursa(job #1464057)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 22 iulie 2015 11:10:02
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define MAX 1001
#define INF 1<<30
#define min(a,b) (a < b ? a : b)
using namespace std;

vector<int> l[MAX];
int n, m, i, path[MAX], C[MAX][MAX], G[MAX][MAX], x, y, z;
long long flux;

void bfs(int* dim);

int main(){
		freopen("maxflow.in", "r", stdin);
		freopen("maxflow.out", "w", stdout);
    int dim;
    scanf("%d%d", &n, &m);
    for(i = 0; i < m; i++){
        scanf("%d%d%d", &x, &y, &z);
        C[x][y] = z;
        l[x].push_back(y);
		l[y].push_back(x);
    }
    
    while(1){
        bfs(&dim);
		if(!dim)
			break;
        flux += dim;
        int v = n;
        while(v != 1){
            int u = path[v];
            G[u][v] += dim;
            G[v][u] -= dim;
            v = u;
        }
	}
    printf("%lld\n", flux);
    return 0;
}

void bfs(int* dim){
    path[1] = -2;
    for(i = 2; i <= n; i++)
        path[i] = -1;
    int m[n + 1];
    m[1] = INF;
	queue<int> q;
    q.push(1);
    while(!q.empty()){
        int aux = q.front();
        q.pop();
        for(vector<int>::iterator it = l[aux].begin(); it < l[aux].end(); it++)
            if(C[aux][*it] - G[aux][*it] > 0 && path[*it] == -1){
                path[*it] = aux;
                m[*it] = min(m[aux], C[aux][*it] - G[aux][*it]);
                if(*it != n)
                    q.push(*it);
                else{
                    *dim = m[n];
                    return;
                }
            }
    }
    *dim = 0;
    return;
}