Cod sursa(job #1464086)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 22 iulie 2015 11:59:24
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 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, viz[MAX], path[MAX], C[MAX][MAX], G[MAX][MAX], x, y, z;
long long flux;

bool bfs();

int main(){
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
    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(bfs()){
		for(i = 0; i < l[n].size(); i++)
			if(viz[l[n][i]] && C[l[n][i]][n] != G[l[n][i]][n]){
				path[n] = l[n][i];
				int minim = INF;
				int v = n;
				while(v != 1){
					int u = path[v];
					minim = min(minim, C[u][v] - G[u][v]);
					v = u;
				}

        		flux += minim;
        		v = n;
        		while(v != 1){
           			int u = path[v];
            		G[u][v] += minim;
            		G[v][u] -= minim;
            		v = u;
        		}
			}
	}
    printf("%lld\n", flux);
    return 0;
}

bool bfs(){
    viz[1] = 1;
    for(i = 2; i <= n; i++)
        viz[i] = 0;
	queue<int> q;
    q.push(1);
    while(!q.empty()){
        int aux = q.front();
        q.pop();
		if(aux != n)
        	for(i = 0; i < l[aux].size(); i++)
            	if(C[aux][l[aux][i]] != G[aux][l[aux][i]] && !viz[l[aux][i]]){
                	viz[l[aux][i]] = 1;
					path[l[aux][i]] = aux;
                   	q.push(l[aux][i]);
            	}
    }
    return viz[n];
}