Cod sursa(job #17410)

Utilizator MariusMarius Stroe Marius Data 15 februarie 2007 20:24:48
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <cstdio>
#include <memory>
using namespace std;

const char iname[] = "critice.in";
const char oname[] = "critice.out";

#define MAXN 1001
#define MAXM 10000

struct edge {
	int from;
	int to;
} E[MAXM];

int N, M;
int deg[MAXN];
int C[MAXN][MAXN];
int G[MAXN][MAXN];


void read_data(void)
{
	int i;
	int x, y, z;
	freopen(iname, "r", stdin);

	scanf("%d %d\n", &N, &M);
	for (i = 0; i < M; ++i) {
		scanf("%d %d %d\n", &x, &y, &z);
		/* memoreaza capacitatea */
		C[x][y] = C[y][x] = z;
		/* adauga in graf muchia (u,v) */
		G[x][++G[x][0]] = y;
		G[y][++G[y][0]] = x;
		/* adauga muchia (u,v) in lista E */
		E[i].from = x, E[i].to = y;
	}
}

int F[MAXN][MAXN];
int Q[MAXN], D[MAXN], P[MAXN];

void BF(void)
{
	int step;
	int l, r, x, y;

	memset(D, 0, sizeof(D));
	memset(P, 0, sizeof(P));
	for (D[1] = step = 1, Q[l = r = 0] = 1; l <= r; ++step) {
		for (; l <= r && D[Q[l]] == step; ++l) {
			x = Q[l];
			for (y = 1; y <= G[x][0]; ++y)
				if (D[ G[x][y] ] == 0)
					if (F[x][ G[x][y] ] < C[x][ G[x][y] ]) {
						D[ Q[++r] = G[x][y] ] = step + 1;
						P[ G[x][y] ] = x;
						if (G[x][y] == N)
							return;
					}
		}
	}
}

void flow(void)
{
	int i;
	int key;

	for (BF(); P[N]; BF())
	{
		key = int(1e8);
		for (i = N; i != 1; i = P[i])
			if (key > C[ P[i] ][i] - F[ P[i] ][i])
				key = C[ P[i] ][i] - F[ P[i] ][i];
		for (i = N; i != 1; i = P[i])
			F[ P[i] ][i] += key,
			F[i][ P[i] ] -= key;
	}
}

#define modul(z) ((z) < 0 ? (-(z)) : (z))

void BFGR(int s, int cnt)		/* breath - first in graful rezidual */
{
	int l, r;
	int i, x, y;

	for (Q[l = r = 0] = s, D[s] = cnt; l <= r; ) {
		for (i = r-l+1; i--; ++l) {
			x  = Q[l];
			for (y = 1; y <= G[x][0]; ++y)
				if (D[ G[x][y] ] == 0)
					if (C[x][ G[x][y] ] > modul(F[x][ G[x][y] ]))
						D[ Q[++r] = G[x][y] ] = cnt;
		}
	}
}


int main(void)
{
	read_data();
	flow();

	freopen(oname, "w", stdout);
	memset(D, 0, sizeof(D));
	BFGR(1, 1);
	BFGR(N, 2);
	
	int cnt = 0;
	for (int i = 0; i < M; ++i)
		if (D[E[i].from] + D[E[i].to] == 3)
			++cnt;
	
	freopen(oname, "w", stdout);
	printf("%d\n", cnt);
	for (int i = 0; i < M; ++i)
		if (D[E[i].from] + D[E[i].to] == 3)
			printf("%d\n", i+1);

	return 0;
}