Cod sursa(job #573049)

Utilizator mottyMatei-Dan Epure motty Data 5 aprilie 2011 20:35:05
Problema Critice Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <queue>

using namespace std;

ifstream in("critice.in");
ofstream out("critice.out");

struct edge{
	int a, b;
};

const int N = 1001;
const int M = 10001;
const int INF = 0x3f3f3f;

int n, m;
int fat[N];
int check[N];
int c[N][N];
int f[N][N];

bool vis[N];

edge edges[M];

void Read()
{
	in >> n >> m;

	for (int i = 1; i <= m; ++i)
	{
		int cap;

		in >> edges[i].a >> edges[i].b >> cap;

		c[edges[i].a][edges[i].b] = cap;
		c[edges[i].b][edges[i].a] = cap;
	}
}

bool Road()
{
	memset(vis, 0, sizeof(vis));
	queue <int> q;

	q.push(1);
	vis[1] = true;

	while (!q.empty() && !vis[n])
	{
		int node = q.front();

		for (int i = 1; i <= n; ++i)
		{
			if (vis[i] || c[node][i] <= f[node][i])
				continue;

			vis[i] = true;
			fat[i] = node;
			q.push(i);
		}

		q.pop();
	}

	return vis[n];
}

void GetMaxFlow()
{
	while (Road())
	{
		int node = n;
		int minFlow = INF;

		while (node != 1)
		{
			if (c[fat[node]][node] - f[fat[node]][node] < minFlow)
				minFlow = c[fat[node]][node] - f[fat[node]][node];

			node = fat[node];
		}

		node = n;
		if (minFlow == 0)
			continue;

		while (node != 1)
		{
			c[fat[node]][node] += minFlow;
			c[node][fat[node]] -= minFlow;

			node = fat[node];
		}
	}
}

void Digg(int node, int val)
{
	check[node] = val;

	for (int i = 1; i <= n; ++i)
		if (!check[i] && c[node][i] > f[node][i])
			Digg(i, val);
}

int CountCriticNodes()
{
	int result = 0;

	for (int i = 1; i <= m; ++i)
		if (check[edges[i].a] + check[edges[i].b] == 444)
			++result;

	return result;
}

void PrintCriticNodes()
{
	for (int i = 1; i <= m; ++i)
		if (check[edges[i].a] + check[edges[i].b] == 444)
			out << i << "\n";
}

int main()
{
	Read();

	GetMaxFlow();

	Digg(1, 123);
	Digg(n, 321);

	out << CountCriticNodes() << "\n";
	PrintCriticNodes();

	return 0;
}