Cod sursa(job #528922)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 3 februarie 2011 20:51:57
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <stdio.h>
#define maxn 1024
#define maxm 10005
#define oo 1000000

struct nod {
	int inf;
	nod *next;
} *A[maxn];

struct muchii {
	int a,b;
} id[maxm];

int i,N,M;
int C[maxn][maxn],from[maxn],x[maxn],y[maxn],sol[maxm];

void citire()
{
	int x,y,c; nod *q;
	scanf("%d %d",&N,&M);
	for(i=1;i<=M;i++)
	{
		scanf("%d %d %d",&x,&y,&c);
		q=new nod;
		q->inf=y;
		q->next=A[x];
		A[x]=q;
		q=new nod;
		q->inf=x;
		q->next=A[y];
		A[y]=q;
		C[y][x]=C[x][y]=c;
		id[i].a=x; id[i].b=y;
	}
}

inline int min(int a, int b)
{
	return (a>b)? b : a;
}

int bfs()
{
	int pi,ps,k,cd[maxn]; ps=pi=1;
	for(i=1;i<=N;i++) from[i]=0;
	cd[1]=1;
	while(ps<=pi)
	{
		k=cd[ps];
		for(nod *q=A[k];q;q=q->next)
			if(from[q->inf]==0 && C[k][q->inf]>0)
			{
				cd[++pi]=q->inf;
				from[q->inf]=k;
				if(q->inf==N) return 1;
			}
		ps++;
	}
	return 0;
}

void search(int st,int v[])
{
	int pi,ps,k,cd[maxn];
	for(i=1;i<=N;i++) v[i]=0;
	pi=ps=1; cd[1]=st; v[st]=1;
	while(ps<=pi)
	{
		k=cd[ps];
		for(nod *q=A[k];q;q=q->next)
			if(v[q->inf]==0 && C[k][q->inf]>0 && C[q->inf][k])
			{
				cd[++pi]=q->inf;
				v[q->inf]=1;
			}
		ps++;
	}
}

int main()
{
	freopen("critice.in","r",stdin);
	freopen("critice.out","w",stdout);
	citire();
	while(bfs())
	{
		int k=N,flux=oo;
		do
		{
			flux=min(flux,C[from[k]][k]);
			k=from[k];
		}
		while(k!=1);
		k=N;
		do
		{
			C[from[k]][k]-=flux;
			C[k][from[k]]+=flux;
			k=from[k];
		}
		while(k!=1);
	}
	search(1,x);
	search(N,y);
	for(i=1;i<=M;i++)
		if(x[id[i].a] && y[id[i].b] || x[id[i].b] && y[id[i].a])
			sol[++sol[0]]=i;
	printf("%d\n",sol[0]);
	for(i=1;i<=sol[0];i++)
		printf("%d\n",sol[i]);
}