Cod sursa(job #429174)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 29 martie 2010 21:37:04
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <cstdio>
#include <vector>

#define nmax 1005
#define mmax 10005
#define INF 0x3f3f3f

#define pb push_back
#define VIT vector <int> :: iterator

using namespace std;

int F [nmax][nmax], C [nmax][nmax], c [nmax * nmax], tx [mmax], ty [mmax], dad [nmax];
int  n, m, sol [mmax], nr;
vector <int> G [nmax];
bool viz [nmax], viz1 [nmax], viz2 [nmax];
void read ()
{	
	int x, y, z, i;
	scanf ("%d%d\n", &n, &m);
	for (i = 1; i <= m; i++)
	{
		scanf ("%d%d%d\n", &x, &y, &z);
		G [x].pb (y);
		G [y].pb (x);
		C [x][y] = z;
		C [y][x] = z;
		tx [i] = x;
		ty [i] = y;
	}
}
inline bool bfs ()
{
	int p, u, node, V;
	memset (viz, 0, sizeof (viz));
	p = u = 0;
	c [p] = 1;
	viz [1] = 1;
	VIT it;
	while (p <= u)
	{
		node = c [p++];
		if (node == n) return viz [n];
		for (it = G [node].begin (); it != G [node].end (); it++)
		{
			V = *it;
			if (!viz [V] && F [node][V] < C [node][V])
			{
				viz [V] = 1;
				dad [V] = node;
				c [++u] = V;
			}
		}
	}
	return viz [n];
}
void solve ()
{	
	VIT it;
	int flow, node;
	for (; bfs (); )
		for (it = G [n].begin (); it != G [n].end (); it++)
		{
			node = *it;
			if (viz [node])
			{
				flow = INF;
			        dad [n] = node;	
				for (node = n; node != 1; node = dad [node])
					if (flow > C [dad [node]][node] - F [dad [node]][node])
						flow = C [dad [node]][node] - F [dad [node]][node];
				if (flow)
					for (node = n; node != 1; node = dad [node])
					{
						F [dad [node]][node] += flow;
						F [node][dad [node]] -= flow;
					}
			}
		}
}
void dfs1 (int node)
{
	viz1 [node] = 1; 
	VIT it;
	for (it = G [node].begin (); it != G [node].end (); it++)
		if (!viz1 [*it] && (C [node][*it] - F [node][*it] > 0 || C [*it][node] - F [*it][node] > 0)) 
			dfs1 (*it);
}
void dfsn (int node)
{
	viz2 [node] = 1;
	VIT it;
	for (it = G [node].begin (); it != G [node].end (); it++)
		if (!viz2 [*it] && (C [node][*it] - F [node][*it] > 0 || C [*it][node] - F [*it][node] > 0))
			dfsn (*it);
}
void real_solve ()
{	
	int i;
	for (i = 1; i <= m; i++)
		if (viz1 [tx [i]] && viz2 [ty [i]])
			if (C [tx [i]][ty [i]] - F [tx [i]][ty [i]] == 0)
				sol [++nr] = i;
		else if (viz1 [ty [i]] && viz2 [tx [i]])
			if (C [ty [i]][tx [i]] - F [ty [i]][tx [i]] == 0)
				sol [++nr] = i;
		
	printf ("%d\n", nr);
	for (i = 1; i <= nr; i++)
		printf ("%d\n", i);
}
int main ()
{
	freopen ("critice.in", "r", stdin);
	freopen ("critice.out", "w", stdout);
	read ();
	solve ();
	dfs1 (1);
	dfsn (n);
	real_solve ();
	return 0;
}