Cod sursa(job #318575)

Utilizator raduzerRadu Zernoveanu raduzer Data 28 mai 2009 18:32:54
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

const int INF = 0x3f3f3f3f;
const int MAX_N = 1024;
const int MAX_M = 10 * 1024;

using namespace std;

int n, m, sol;
int c[MAX_N][MAX_N];
int f[MAX_N], up[MAX_N], q[MAX_N], s[MAX_N];
int solv[MAX_M], z;

struct muchie {
	int x, y;
} mc[MAX_N];

int bf()
{
	memset(f, 0, sizeof(f));
	f[1] = INF;
	q[0] = 1;
	int l, r;
	
	for (l = r = 0; l <= r; ++l)
	{
		int nod = q[l];
		
		for (int i = 1; i <= n; ++i)
			if (c[nod][i] > 0 && f[i] == 0)
			{
				f[i] = min(f[nod], c[nod][i]);
				up[i] = nod;
				q[++r] = i;
				if (f[n]) {
					// Am gasit flux;
					sol += f[n];
					for (int kko = n; kko != 1; kko = up[kko])
					{
						c[up[kko]][kko] -= f[n];
						c[kko][up[kko]] += f[n];
					}
					return 1;
				}
			}
	}
	
	return 0;
}

void bfs1(int val, int st)
{
	memset(q, 0, sizeof(q));
	memset(f, 0, sizeof(f));
	
	s[st] = val;
	q[0] = st;
	int l, r;
	
	for (l = r = 0; l <= r; ++l)
	{
		int nod = q[l];
		
		for (int i = 1; i <= n; ++i)
		{
			if (val == 1 && c[nod][i] && !f[i])
			{
				s[i] = val;
				f[i] = 1;
				
				q[++r] = i;
			}
			
			if (val == 2 && c[i][nod] && !f[i])
			{
				s[i] = val;
				f[i] = 1;
				
				q[++r] = i;
			}
		}
	}
}

int main()
{
	int x, y, z, i;
	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", &x, &y, &z);
		
		mc[i].x = x;
		mc[i].y = y;
		
		c[x][y] = z;
		c[y][x] = z;
	}
	
	while (bf())
		;

	bfs1(1, 1);
	bfs1(2, n);
	z = 0;
	
	for (i = 1; i <= m; ++i)
	{
		int xx = mc[i].x, yy = mc[i].y;
		
		if ((!c[xx][yy] && c[yy][xx] || c[xx][yy] && !c[yy][xx]) && 
			s[xx] + s[yy] == 3) solv[++z] = i;
	}
	
	printf("%d\n", z);
	for (i = 1; i <= z; ++i) printf("%d\n", solv[i]);
}