Cod sursa(job #3006)

Utilizator ionescu_bogdanIonescu Bogdan-Gabriel ionescu_bogdan Data 20 decembrie 2006 13:36:27
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define nmax 1024
#define mmax 10024
#define oo 100000
#define min(a,b) (a<b?a:b)

int n,m,a[nmax],b[nmax],c[nmax],f[nmax][nmax],v[nmax],i,j,k;
int totalflow,maxflow,maxloc,pathcapacity,curnode,prevnode[nmax],flow[nmax],nextnode;

void floww()
{
	totalflow=0;

	while (1)
	{
		for (i=1;i<=n;i++)
			prevnode[i]=0,flow[i]=0,v[i]=0;
		flow[1]=oo;

		while (1)
		{
			maxflow=maxloc=0;
			for (i=1;i<=n;i++)
				if ((flow[i]>maxflow)&&(!v[i]))
					maxflow=flow[i],maxloc=i;
			if (maxloc==0)
				break;
			if (maxloc==n)
				break;
			v[maxloc]=1;
			for (i=1;i<=n;i++)
				if (f[maxloc][i]>0)
					if (flow[i]<min(maxflow,f[maxloc][i]))
						prevnode[i]=maxloc,flow[i]=min(maxflow,f[maxloc][i]);
		}
		if (maxloc==0)
			break;

		pathcapacity=flow[n];
		totalflow+=pathcapacity;

		curnode=n;

		while (curnode!=1)
		{
			nextnode=prevnode[curnode];
			f[nextnode][curnode]-=pathcapacity;
			f[curnode][nextnode]+=pathcapacity;
			curnode=nextnode;
		}
	}
}

void fill1(int x)
{
	v[x]=1;
	int i;
	for (i=1;i<=n;i++)
		if ((x!=i)&&(!v[i])&&(f[x][i]>0))
			fill1(i);
}

void fill2(int x)
{
	v[x]=2;
	int i;
	for (i=1;i<=n;i++)
		if ((x!=i)&&(!v[i])&&(f[i][x]>0))
			fill2(i);
}

int main()
{
	freopen("critice.in","r",stdin);
	freopen("critice.out","w",stdout);

	scanf("%d%d",&n,&m);
	for (i=0;i<m;++i)
		scanf("%d%d%d",a+i,b+i,c+i),f[a[i]][b[i]]=f[b[i]][a[i]]=c[i];
	floww();
	memset(v,0,sizeof(v));
	fill1(1);
	fill2(n);
	int k=0;
	for (i=0;i<m;i++)
		if (((v[a[i]]==1)&&(v[b[i]]==2))||((v[a[i]]==2)&&(v[b[i]]==1)))
			++k;
	printf("%d\n",k);
	for (i=0;i<m;i++)
		if (((v[a[i]]==1)&&(v[b[i]]==2))||((v[a[i]]==2)&&(v[b[i]]==1)))
			printf("%d\n",i+1);

	return 0;
}