Cod sursa(job #128084)

Utilizator MariusMarius Stroe Marius Data 26 ianuarie 2008 10:22:00
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <stdio.h>
#include <memory.h>

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

#define MAXN 1001
#define MAXM 10000

int n, *G[MAXN], m, E[MAXM][2], deg[MAXN], C[MAXN][MAXN], F[MAXN][MAXN];

int Q[MAXN], T[MAXN], X[MAXN];

int MaxCap;

void read_in(void)
{
	int x, y, c;

	FILE *fi = fopen(iname, "r");

	fscanf(fi, "%d", &n);
	fscanf(fi, "%d", &m);
	for (int i = 0; i < m; ++ i) 
	{
		fscanf(fi, "%d %d %d", &x, &y, &c);
		C[x][y] = C[y][x] = c;
		E[i][0] = x;
		E[i][1] = y;
		deg[x] ++, deg[y] ++;
		if (MaxCap < c)
			MaxCap = c;
	}
	for (int i = 1; i <= n; ++ i) 
	{
		G[i] = new int [deg[i] + 1];
		G[i][deg[i]] = -1;
		deg[i] = 0;
	}
	for (int i = 0; i < m; ++ i) 
	{
		x = E[i][0];
		y = E[i][1];
		G[x][deg[x] ++] = y;
		G[y][deg[y] ++] = x;
	}
	fclose(fi);
}

void BF1(int start, int val)
{
	int head, tail;

	T[start] = val;
	for (Q[head = tail = 0] = start; head <= tail; ++ head)
	{
		int x = Q[head];
		for (int *p = G[x]; *p != -1; ++ p)
		{
			if (T[*p] != val && C[x][*p] - F[x][*p] > 0)
			{
				Q[++ tail] = *p;
				T[*p] = val;
			}
		}
	}
}

void BF2(int start, int val)
{
	int head, tail;

	T[start] = val;
	for (Q[head = tail = 0] = start; head <= tail; ++ head)
	{
		int x = Q[head];
		for (int *p = G[x]; *p != -1; ++ p)
		{
			if (T[*p] != val && C[*p][x] - F[*p][x] > 0)
			{
				Q[++ tail] = *p;
				T[*p] = 2;
			}
		}
	}
}

inline int Min(const int a, const int b) {
	return (a < b) ? a : b;
}

bool BFS(int src, int snk, int delta)
{
	int h, t, i, x;

	memset(T, 0, sizeof(T));
	X[src] = int(1e4);
	T[src] = -1;
	for (Q[h = t = 0] = src; h <= t; ++ h)
	{
		x = Q[h];
		for (int *p = G[x]; *p != -1; ++ p)
			if (!T[*p] && (C[x][*p] - F[x][*p]) >= delta)
			{
				T[*p] = x;
				Q[++ t] = *p;
				X[*p] = Min(X[x], C[x][*p] - F[x][*p]);
				if (*p == snk) 
				{
					for (i = *p; i != -1; i = T[i])
						F[T[i]][i] += X[*p], F[i][T[i]] -= X[*p];
					return true;
				}
			}
	}
	return false;
}	

void MaxFlow(int src, int snk)
{
	int delta;
	
	for (delta = 0; 1 << delta <= MaxCap; ++ delta);
	delta --;

    for (; delta >= 1; delta >>= 1)
		while (BFS(src, snk, delta))
			;
}

int main(void)
{
	read_in();
	MaxFlow(1, n);

	FILE *fo = fopen(oname, "w");

	for (int i = 1; i <= n; ++ i)
		T[i] = -1;
	BF1(1, 1);
	BF2(n, 2);
	int res = 0;
	for (int i = 0; i < m; ++ i) 
	{
		int x = E[i][0];
		int y = E[i][1];
		if (T[x] + T[y] == 3)
			res ++;
	}
	fprintf(fo, "%d\n", res);
	for (int i = 0; i < m; ++ i) 
	{
		int x = E[i][0];
		int y = E[i][1];
		if (T[x] + T[y] == 3)
			fprintf(fo, "%d\n", i + 1);
	}
	fclose(fo);

	return 0;
}