Cod sursa(job #568747)

Utilizator mottyMatei-Dan Epure motty Data 31 martie 2011 17:27:49
Problema Critice Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <queue>

using namespace std;

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

struct muc{
	int a, b;
};

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

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

muc mucs[M];

bool viz[N];

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

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

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

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

bool Bfs()
{
	queue <int> q;

	memset(viz, 0, sizeof(viz));

	viz[1] = 1;
	q.push(1);

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

		for (int i = 1; i <= n; ++i)
			if (!viz[i] && f[node][i] < c[node][i])
			{
				q.push(i);

				viz[i] = true;
				fat[i] = node;
			}

		q.pop();
	}

	return viz[n];
}

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

		while (node != 1)
		{
			minFlow = min(minFlow, c[fat[node]][node] - f[fat[node]][node]);
			node = fat[node];
		}

		node = n;

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

			node = fat[node];
		}
	}
}

queue <int> q;

bool sDist[N];
bool dDist[N];

int noCritics, critics[N];

void Check(int node)
{
	for (int i = 1; i <= n; ++i)
		if (!sDist[i] && c[node][i] > 0 && c[node][i] - f[node][i] > 0)
		{
			sDist[i] = true;
			q.push(i);
		}
}

void CrossSource()
{
	q.push(1);
	sDist[1] = true;

	while (!q.empty())
	{
		Check(q.front());
		q.pop();
	}
}

void Check2(int node)
{
	for (int i = 1; i <= n; ++i)
		if (!dDist[i] && c[node][i] > 0 && c[node][i] - f[node][i] > 0)
		{
			dDist[i] = true;
			q.push(i);
		}
}

void CrossDestination()
{
	q.push(n);
	dDist[n] = true;

	while (!q.empty())
	{
		Check2(q.front());
		q.pop();
	}
}

void GetCritics()
{
	for (int i = 1; i <= m; ++i)
		if (c[mucs[i].a][mucs[i].b] - f[mucs[i].a][mucs[i].b] == 0)
		{
			if (sDist[mucs[i].a] && dDist[mucs[i].b])
				critics[++noCritics] = i;
	
			else if (dDist[mucs[i].b] && dDist[mucs[i].a])
				critics[++noCritics] = i;
		}
}

void PrintCritics()
{
	out << noCritics << "\n";

	for (int i = 1; i <= noCritics; ++i)
		out << critics[i] << "\n";
}

int main()
{
	Read();

	GetMaxFlow();
	
	CrossSource();
	CrossDestination();

	GetCritics();
	PrintCritics();

	return 0;
}