Cod sursa(job #317810)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 25 mai 2009 11:34:28
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define maxN 	1024
#define oo 	100000000

int F[maxN][maxN], C[maxN][maxN], P[maxN], Flux[maxN];
int N, M, S, D, Q[maxN * maxN];

inline int min (int a, int b) {
	if (a > b)	return b;
	return a;
}

bool drum () {
 	int st, dr, i, now;
	memset (P, 0, sizeof(P));
	memset (Flux, 0, sizeof(Flux));

	Q[st = 0] = S; dr = 1;
        Flux[S] = oo;

	while (st < dr) {
		now = Q[st ++ ];
        	for (i = 1; i <= N; ++ i)
			if (!Flux[i] && C[now][i] != 0) {
				Flux[i] = min (Flux[now], abs (C[now][i]));
        			Q[dr ++] = i;
				P[i] = now;
				if (i == D)
					return true;
			}
	}

	return false;

}
void flux () {
	int nod, i, j, Fmax = 0;

        while (drum () ) {
     //   drum ();     
	
      // 	 	for (i = 1; i <= N; ++ i)
    //    		fprintf(stderr, "%d ", P[i]);
	//	fprintf(stderr, "*");
		for (nod = D; nod != S; nod = P[nod]) {
	       		if (C[P[nod]][nod] > 0) {
				F[P[nod]][nod] += Flux[D];
				C[P[nod]][nod] -= Flux[D];
				C[nod][P[nod]] = - Flux[D];
			} else {
	                        F[P[nod]][nod] -= Flux[D];
				C[P[nod]][nod] += Flux[D];
				C[nod][P[nod]] = - Flux[D];    
				}
	       	}
	
		Fmax += Flux[D];     
	
/*		printf("****************************\n");
		for (i = 1; i <= N; ++ i) {
			for (j = 1; j <= N; ++ j)
				printf("%d ", C[i][j]);
			printf("\n");
		}

		printf("\n");
		for (i = 1; i <= N; ++ i) {
			for (j = 1; j <= N; ++ j)
				printf("%d ", F[i][j]);
			printf("\n");
       		}
  */
        }

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


}

int main () {
        int i, a, b, c;

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

	scanf("%d%d", &N, &M);

	S = 1; D = N;

	for (i = 1; i <= M; ++ i) {
 		scanf("%d%d%d", &a, &b, &c);

		C[a][b] += c;
	}

        flux ();
}