Cod sursa(job #318497)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 28 mai 2009 17:45:42
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.59 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 V[2][maxN];

void bfs () {
	int st, dr, i, now, next;

	Q[st = 0] = SOURCE; dr = 1;
        
	V[0][SOURCE] = 1; V[1][DEST] = 1;

	while (st < dr) {

		now = Q[st ++];

		for (i = 0; i < (int) G[now].size (); ++ i) {
			next = G[now][i];
			if (C[now][next] == 0 || V[0][next])
				continue;

			V[0][next] = 1;
			Q[dr ++] = next;
		}
	}

        Q[st = 0] = DEST; dr = 1;

	while (st < dr) {

		now = Q[st ++];

		for (i = 0; i < (int) G[now].size (); ++ i) {
			next = G[now][i];
			if (C[next][now] == 0 || V[1][next])
				continue;

			V[1][next] = 1;
			Q[dr ++] = next;
		}
	}
}

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;
	}

	Sol = flux ();

	bfs();

        /*for (i = 1; i <= N; ++ i)
		printf("%d ", V[0][i]);
	puts ("");

	for (i = 1; i <= N; ++ i)
		printf("%d ", V[1][i]);
	puts ("");
          */
	for (i = 0; i < (int) Muchii.size (); ++ i) {
                int a = Muchii[i].ff;
		int b = Muchii[i].ss;

		if ((V[0][a] && V[1][b]) || (V[0][b] && V[1][a]))
			Solutie.pb(i + 1);
	}

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

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