Cod sursa(job #715422)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 17 martie 2012 10:47:36
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;

const int dim = 1005, OO = (1<<31) - 1;
int N, M, K, T[dim], Q[dim], C[dim][dim], F[dim][dim], I[dim][dim], viz[dim][dim];
vector <int> V[dim];

void cit ()
{
	scanf ("%d%d", &N, &M);
	for (int i = 1, x, y, c; i <= M; i++)
	{
		scanf ("%d%d%d", &x, &y, &c);
		
		V[x].push_back (y);
		V[y].push_back (x);
		
		C[x][y] = C[y][x] = c;
		I[x][y] = I[y][x] = i;
	}
}

int bfs ()
{
	int p = 0, u = 0, n, f, i, ok = 0;
	for (i = 1; i <= N; i++)
		T[i] = -1;
	Q[0] = 1;
	T[1] = 0;
	
	while (p <= u)
	{
		n = Q[p];
		for (i = 0; i < V[n].size(); i++)
		{
			f = V[n][i];
			if (T[f] == -1 && C[n][f] - F[n][f] + F[f][n] > 0)
			{
				if (f == N)
				{
					ok = 1;
					continue;
				}
				
				Q[++u] = f;
				T[f] = n;
			}
		}		
		p++;
	}
	
	return ok;
}



void flx ()
{
	int n, f, m, i;
	while ( bfs () )
	{
		for (int i = 0; i < V[N].size(); i++)
		{
			n = V[N][i];
			f = N;
			m = OO;
			while (n != 0)
			{
				m = min (m, C[n][f] - F[n][f] + F[f][n]);
				if (m == 0)
					break;
				f = n;
				n = T[f];
			}
			if (m == 0)
				continue;
			
			n = V[N][i];
			f = N;
			while (n != 0)
			{
				if (m <= F[f][n])
					F[f][n] -= m;
				else
				{
					F[n][f] += m - F[f][n];
					F[f][n] = 0;
				}
				f = n;
				n = T[f];
			}
		}		
	}
}

void dfs (int n, int k)
{
	for (int i = 0, f; i < V[n].size(); i++)
	{
		f = V[n][i];
		if ((viz[n][f] & 1<<k) == 0)
		{
			viz[n][f] |= 1<<k;
			viz[f][n] |= 1<<k;
			if ( !(C[n][f] == F[n][f] || C[f][n] == F[f][n]) )
				dfs (f, k);
		}
	}
}

void afi ()
{
	vector <int> R;
	for (int i = 1, j; i <= N; i++)
		for (j = i + 1; j <= N; j++)
			if (viz[i][j] == 3)
				R.push_back (I[i][j]);

	sort (R.begin(), R.end());
	printf ("%d\n", R.size());
	for (int i = 0; i < R.size(); i++)
		printf ("%d\n", R[i]);
}

int main ()
{
	freopen ("critice.in", "r", stdin);
	freopen ("critice.out", "w", stdout);
	
	cit ();
	flx ();
	dfs (1, 0);
	dfs (N, 1);
	afi ();
	
	return 0;
}