Cod sursa(job #295417)

Utilizator FlorianFlorian Marcu Florian Data 3 aprilie 2009 11:57:32
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include<cstdio>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
#define MAX_N 1024
#define Inf 0x3f3f3f3f
vector <int> G[MAX_N];
int N,M;
int c[MAX_N][MAX_N], f[MAX_N][MAX_N];
int v1[MAX_N], v2[MAX_N];
int mx[MAX_N*10], my[MAX_N*10], p;
int T[MAX_N],m;
int okay;
void read()
{
	freopen("critice.in","r",stdin);
	freopen("critice.out","w",stdout);
	scanf("%d%d",&N,&M);
	int x,y,z;
	m=M;
	while(M--)
	{
		scanf("%d%d%d",&x,&y,&z);
		G[x].push_back(y);
		G[y].push_back(x);
		c[x][y] += z; c[y][x] += z;
		mx[++p] = x; my[p] = y;
	}
}
int bfs()
{
	int p=1, u=1, Q[MAX_N];
	memset(T,0,sizeof(T));
	Q[1] = 1;
    okay = 0;
	T[1] = 1;
	int x,i,V;
	while(p<=u)
	{
		x = Q[p++];
		for(i=0;i<G[x].size(); ++i)
		{
			V = G[x][i];
			if(T[V] || c[x][V] - f[x][V] == 0) continue;
			if(V == N) { okay=1; continue; }
			T[V] = x;
			Q[++u] = V;
			
		}
	}
	return okay;
}
void maxflow()
{
	int fmin,nod,i;
	for(;bfs();)
	{
		for(i=0;i<G[N].size(); ++i)
		{
			if(!okay) continue;
			fmin = Inf;
			T[N] = G[N][i];
			for(nod = N; nod!=1; nod=T[nod] )
				fmin = min(fmin, c[T[nod]][nod]-f[T[nod]][nod]);
			for(nod=N;nod!=1;nod=T[nod])
			{
				f[T[nod]][nod] += fmin;
				f[nod][T[nod]] -= fmin;
			}
		}
	}
}
void dfs(int x, int v[])
{
	int i, y;
	v[x] = 1;
	for(i=0; i<G[x].size(); ++i)
	{
		y = G[x][i];
		if(!v[y] && c[x][y] - f[x][y] > 0 && c[y][x] - f[y][x] > 0) dfs(y,v);
	}
}
int main()
{
	read();
	maxflow();
	dfs(1,v1); // drum de la 1 la x
	dfs(N,v2); // drum de la N la x
	int i, x, y, nrs = 0 , sol[10*MAX_N];
	for(i=1;i<=m;++i)
	{
		x = mx[i]; y = my[i];
		if( (c[x][y] - f[x][y] <= 0 && v1[x] && v2[y]) || ( c[y][x] - f[y][x] <= 0 && v1[y] && v2[x]) ) sol[++nrs] = i;
	}
	printf("%d\n",nrs);
	for(i=1;i<=nrs; ++i) printf("%d\n",sol[i]);
	return 0;
}