Cod sursa(job #626726)

Utilizator sebii_cSebastian Claici sebii_c Data 28 octombrie 2011 02:06:47
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <stdio.h>
#include <vector>
#include <cstring>
using namespace std;

#define NMAX 1010
#define INF (1<<30)
#define pb push_back

vector<int> A[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX];
int from[NMAX], viz[NMAX];
int cd[NMAX];
int N, M;

inline int min(int a, int b)
{
    return (a<b)?a:b;
}

int BFS()
{
    int V, i, j, node;
    cd[0] = 1;
    cd[1] = 1;
    memset(viz, 0, sizeof(viz));
    viz[1] = 1;
    
    for (i=1; i<=cd[0]; ++i) {
	node = cd[i];
	if (node == N)
	    continue;
	for (j=0; j<A[node].size(); ++j) {
	    V = A[node][j];
	    if (C[node][V] == F[node][V] || viz[V])
		continue;
	    viz[V] = 1;
	    cd[++cd[0]] = V;
	    from[V] = node;
	}
    }
    return viz[N];
}

int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    scanf("%d %d", &N, &M);
    int x, y, cost, i, flow, fmin;
    for (i=1; i<=M; ++i) {
	scanf("%d %d %d", &x, &y, &cost);
	A[x].pb(y);
	A[y].pb(x);
	C[x][y] += cost;
    }
    
    for (flow = 0; BFS(); )
	for (i=0; i<A[N].size(); ++i) {
	    int node = A[N][i];
	    if (C[node][N] == F[node][N] || !viz[node])
		continue;
	    from[N] = node;

	    fmin = INF;
	    for (node = N; node != 1; node = from[node]) 
		fmin = min(fmin, C[from[node]][node] - F[from[node]][node]);
	    if (fmin == 0)
		continue;

	    for (node = N; node != 1; node = from[node]) {
		F[from[node]][node] += fmin;
		F[node][from[node]] -= fmin;
	    }
	    flow += fmin;
	}
    printf("%d", flow);
    return 0;
}