Cod sursa(job #569108)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 31 martie 2011 23:19:19
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#define NMAX 1005
#define LMAX 10005
#define INF 1000000000
#define pb push_back
using namespace std;
struct muchie{int a,b;};
muchie A[LMAX];
vector <int> B[NMAX];
int n,m,C[NMAX][NMAX],F[NMAX][NMAX],dad[NMAX],Q[NMAX],sol[LMAX],r;
char viz[NMAX],D[NMAX][2];
void read()
{
	scanf("%d%d",&n,&m);
	int i,x;
	for (i=1; i<=m; i++)
	{
		scanf("%d%d%d",&A[i].a,&A[i].b,&x);
		C[A[i].a][A[i].b]=x; C[A[i].b][A[i].a]=x; 
		B[A[i].a].pb(A[i].b); B[A[i].b].pb(A[i].a);
	}
}
inline int min(int x,int y)
{
	return x<y ? x : y;
}
int BF()
{
	Q[0]=1; Q[1]=1;
	memset(viz,0,sizeof(viz));
	viz[1]=1;
	int i,j,nod,vec;
	for (i=1; i<=Q[0]; i++)
	{
		nod=Q[i];
		for (j=0; j<B[nod].size(); j++)
		{
			vec=B[nod][j];
			if (C[nod][vec]==F[nod][vec] || viz[vec])
				continue ;
			viz[vec]=1; dad[vec]=nod;
			if (vec!=n)
				Q[++Q[0]]=vec;
		}
	}
	return viz[n];
}
void dfs1(int nod)
{
	D[nod][0]=1;
	int i,vec;
	for (i=0; i<B[nod].size(); i++)
	{
		vec=B[nod][i];
		if (!D[vec][0] && F[nod][vec]<C[nod][vec])
			dfs1(vec);
	}
}
void dfs2(int nod)
{
	D[nod][1]=1;
	int i,vec;
	for (i=0; i<B[nod].size(); i++)
	{
		vec=B[nod][i];
		if (!D[vec][1] && F[vec][nod]<C[vec][nod])
			dfs2(vec);
	}
}
void solve()
{
	int i,nod,val;
	while (BF())
	{
		for (i=0; i<B[n].size(); i++)
		{
			nod=B[n][i];
			if (F[nod][n]==C[nod][n] || !viz[nod])
				continue ;
			dad[n]=nod;
			val=INF;
			for (nod=n; nod!=1; nod=dad[nod])
				val=min(val,C[dad[nod]][nod]-F[dad[nod]][nod]);
			for (nod=n; nod!=1; nod=dad[nod])
			{
				F[dad[nod]][nod]+=val;
				F[nod][dad[nod]]-=val;
			}
		}
	}
	
	dfs1(1);
	dfs2(n);
	
	for (i=1; i<=m; i++)
		if ((F[A[i].a][A[i].b]==C[A[i].a][A[i].b] && D[A[i].a][0] && D[A[i].b][1]) || 
			(F[A[i].b][A[i].a]==C[A[i].b][A[i].a] && D[A[i].b][0] && D[A[i].a][1]))
			sol[++r]=i;
	printf("%d\n",r);
	for (i=1; i<=r; i++)
		printf("%d\n",sol[i]);
}
int main()
{
	freopen("critice.in","r",stdin);
	freopen("critice.out","w",stdout);
	read();
	solve();
	return 0;
}