Cod sursa(job #478283)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 17 august 2010 22:52:25
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <stdio.h>
#include <string.h>

#include <vector>
#include <queue>

using namespace std;

int n, m;
int up[1002], viz[1002];
int c[1002][1002], f[1002][1002];

vector <int> v[1002];

inline int calc (int x, int y) {return c[x][y] - f[x][y];}
inline int minim (int a, int b) {return a < b ? a : b;}

int bfs ()
{
	memset (up, -1, sizeof (up));
	up[1] = 0;
	
	int nod;
	queue <int> q;
	
	q.push (1);
	while (!q.empty ())
	{
		nod = q.front ();
		q.pop ();
		
		for (vector <int> :: iterator it = v[nod].begin (); it != v[nod].end (); it ++)
			if (up[*it] == -1 && calc (nod, *it) > 0)
			{
				up[*it] = nod;
				if (*it == n)
					return 1;
				
				q.push (*it);
			}
	}
	
	return 0;
}

void bfs2 (int start)
{
	int nod;
	queue <int> q;
	
	q.push (start);
	viz[start] += start;
	while (!q.empty ())
	{
		nod = q.front ();
		q.pop ();
		
		for (vector <int> :: iterator it = v[nod].begin (); it != v[nod].end (); it ++)
			if (viz[*it] == -1 && calc (nod, *it) > 0)
			{
				viz[*it] += start;
				q.push (*it);
			}
	}
}

void flux ()
{
	int nod, min;
	
	while (bfs ())
	{
		nod = n;
		min = calc (up[nod], nod);
		while (up[nod])
		{
			min = minim (min, calc (up[nod], nod));
			nod = up[nod];
		}
		
		nod = n;
		while (up[nod])
		{
			f[up[nod]][nod] += min;
			f[nod][up[nod]] -= min;
			
			nod = up[nod];
		}
	}
}

void print ()
{
	freopen ("critice.in", "r", stdin);
	
	int i, x, y, cap, sol[10002] = {0};
	
	scanf ("%d %d", &n, &m);
	for (i = 1; i <= m; i ++)
	{
		scanf ("%d %d %d", &x, &y, &cap);
		
		if (viz[x] + viz[y] == n - 1)
			sol[++sol[0]] = i;
	}
	
	printf ("%d\n", sol[0]);
	for (i = 1; i <= sol[0]; i ++)
		printf ("%d\n", sol[i]);
}

int main ()
{
	freopen ("critice.in", "r", stdin);
	freopen ("critice.out", "w", stdout);
	
	scanf ("%d %d", &n, &m);
	
	int i, x, y, cap;
	
	for (i = 1; i <= m; i ++)
	{
		scanf ("%d %d %d", &x, &y, &cap);
		
		c[x][y] += cap;
		c[y][x] += cap;
		v[x].push_back (y);
		v[y].push_back (x);
	}
	
	flux ();
	
	memset (viz, -1, sizeof (viz));
	bfs2 (1);
	bfs2 (n);
	
	print ();
	
	return 0;
}