Cod sursa(job #318468)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 28 mai 2009 17:20:16
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <stdio.h>
#include <string.h>
#include <vector>

using namespace std;
                
#define maxN 	1001
#define SOURCE 	1
#define DEST 	N
#define pb	push_back
#define oo 	100000000
#define pii	pair <int, int> 
#define ff	first
#define ss	second
#define mp	make_pair

int Q[maxN * 3], P[maxN], T[maxN], C[maxN][maxN], CC[maxN][maxN];
int N, M;

vector < int > G[maxN];
vector < pii > Muchii;
vector < int > Solutie;

bool drum () {
        int st, dr, i, now, next;

	memset (P, 0, sizeof(P));
	memset (T, 0, sizeof(T));

	Q[st = 0] = SOURCE; dr = 1;
	                
	T[SOURCE] = oo; P[SOURCE] = -1;

	while (st < dr) {
         	now = Q[st ++ ];

		for (i = 0; i < (int) G[now].size (); ++ i) {
                 	next = G[now][i];

			if (! P[next] && C[now][next] > 0) {
                         	P[next] = now;
				T[next] = min (abs (C[now][next]), T[now]);
				Q[dr ++] = next;

				if (next == DEST)
					return true;
			}

		}

	}

	return false;
}

int flux () {
        int FluxTotal = 0, nod, i, j;

        while (drum () ) {
	        for (nod = DEST; nod != SOURCE; nod = P[nod]) {
                       	C[P[nod]][nod] -= T[DEST];
	       		C[nod][P[nod]] += T[DEST];
		}
             
		FluxTotal += T[DEST];
       }

	return FluxTotal;
}

int main () {
        int k, i, j, a, b, c, Sol = 0, now;

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

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

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

		G[a].pb(b);
		G[b].pb(a);

		Muchii.pb (mp (a, b));

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

	Sol = flux ();

	for (k = 0; k < (int) Muchii.size (); ++ k) {
		for (i = 1; i <= N; ++ i)
			for (j = 1; j <= N; ++ j)
				C[i][j] = CC[i][j];

		++ C[Muchii[k].ff][Muchii[k].ss];
        	++ C[Muchii[k].ss][Muchii[k].ff];

		if ((now = flux ()) > Sol)
			Solutie.pb(k + 1);

	}

	printf("%d\n", Solutie.size ());

	for (i = 0; i < (int) Solutie.size (); ++ i)
		printf("%d\n", Solutie[i]);
}