Cod sursa(job #6576)

Utilizator IgnitionMihai Moraru Ignition Data 20 ianuarie 2007 11:26:10
Problema Critice Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <stdio.h>
#include <string.h>
#include <limits.h>

#define MN (1000)
#define MM (10000)
#define MIN(a, b) (a < b? a : b)

int c[MN][MN], f[MN][MN], g[MN][MN], p[MN], m[MN], q[MN], front, back;
int N, M, F;
int edge[MM][2];

int bfs(int s, int t)
{
	int n1, n2, i;
	memset(m, 0, sizeof(m)); memset(p, -1, sizeof(p));
	front = back = 0; m[s] = LONG_MAX; p[s] = s;
	for(q[back ++] = s; front < back; ++ front)
		for(n1 = q[front], i = 1; i <= g[n1][0]; ++ i) if(p[n2 = g[n1][i]] == -1 && c[n1][n2]-f[n1][n2] > 0) {
			p[n2] = n1; m[n2] = MIN(m[n1], c[n1][n2]-f[n1][n2]);
			if(n2 != t)
				q[back ++] = n2;
			else return m[t];
		}
	return m[t];
}

void ek()
{
	int n1, n2;
	for(F = 0; bfs(0, N-1); F += m[N-1]) for(n1 = N-1, n2 = p[n1]; n1; n1 = n2, n2 = p[n1])
		f[n2][n1] += m[N-1], f[n1][n2] -= m[N-1];
}

void bfs2(int s)
{
	int n1, n2, i;
	front = back = 0; m[s] = 1;
	for(q[back ++] = s; front < back; ++ front)
		for(n1 = q[front], i = 1; i <= g[n1][0]; ++ i) if(m[n2 = g[n1][i]] != 1 && c[n1][n2]-f[n1][n2] > 0)
			m[n2] = 1, q[back ++] = n2;
}

void bfs3(int s)
{
	int n1, n2, i;
	front = back = 0; m[s] = 2;
	for(q[back ++] = s; front < back; ++ front)
		for(n1 = q[front], i = 1; i <= g[n1][0]; ++ i) if(m[n2 = g[n1][i]] != 2 && c[n2][n1]-f[n2][n1] > 0)
			m[n2] = 2, q[back ++] = n2;
}

int main()
{
	int i, j, k, l;

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

	scanf("%d %d", &N, &M);
	for(k = 0; k < M; ++ k) {
		scanf("%d %d %d", &i, &j, &l); -- i; -- j;
		c[i][j] = c[j][i] = l;
		g[i][++ g[i][0]] = j;
		g[j][++ g[j][0]] = i;
		edge[k][0] = i; edge[k][1] = j;
	}

	/*
	for(i = 0; i < N; ++ i, printf("\n")) for(printf("%d:", i), j = 1; j <= g[i][0]; ++ j)
		printf(" %d (%d)", g[i][j], c[i][g[i][j]]);
		*/

	ek();

	/*
	for(printf("%d\n", F), i = 0; i < N; ++ i, printf("\n")) for(j = 0; j < N; ++ j)
		printf("%d(%d) ", f[i][j], c[i][j]);
		*/

	memset(m, 0, sizeof(m));
	bfs2(0);
	bfs3(N-1);

	for(front = back = k = 0; k < M; ++ k) {
		i = edge[k][0]; j = edge[k][1];
		if((m[i] == 1 && m[j] == 2) || (m[i] == 2 && m[j] == 1))
			q[back ++] = k;
	}

	/*
	for(i = 0; i < N; ++ i)
		printf("%d ", m[i]); printf("\n");
		*/

	for(printf("%d\n", back); front < back; ++ front)
		printf("%d\n", q[front]+1);

	return 0;
}