Cod sursa(job #43575)

Utilizator DorinOltean Dorin Dorin Data 30 martie 2007 11:58:43
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
# include <stdio.h>
# include <string>

using namespace std;

# define input "critice.in"
# define output "critice.out"

# define max 1001

# define INF 11111

int f[max][max],a[max][max],i,j,n,m,t[max],coada[max],rez[max],nr;
int x,y,c,r,st,dr,k;

struct muchie
{
	int x,y;
}canal[max];

int min(int x,int y)
{
	return x > y ? y : x;
}

int bf(int s,int d)
{
	coada[1] = s;
	memset(t,0,sizeof(t));
	t[1] = -1;
	int st, dr;
	st=dr=1;
	while(st<=dr)
	{
		i=coada[st];
		for(j=1;j<=n;j++)
			if(!t[j] && a[i][j] > f[i][j])
			{
				coada[++dr] = j;
				t[j] = i;
				if(j == d)
					return 1;
			}

		st++;
	}
	return 0;
}

int main()
{
	freopen(input,"r",stdin);
	freopen(output,"w",stdout);

	scanf("%d%d",&n,&m);
	for(i=1;i<=m;++i)
	{
		scanf("%d%d%d",&x,&y,&c);
		a[x][y] = c;
		a[y][x] = c;
		canal[i].x=x;
		canal[i].y=y;
	}
	st=1,dr=n;

	while(bf(st,dr))
	{
		r = INF;
		i=dr;
		while(i!=st)
		{
			r=min(r,a[t[i]][i]-f[t[i]][i]);
			i=t[i];
		}
		i=dr;
		while(i!=st)
		{
			f[t[i]][i]+=r;
			i=t[i];
		}
	}

	for(k=1;k<=m;k++)
	{
		a[canal[k].x][canal[k].y]++;
		a[canal[k].y][canal[k].x]++;
		if(bf(1,n))
		{
			rez[++nr] = k;
		}
		a[canal[k].x][canal[k].y]--;
		a[canal[k].y][canal[k].x]--;
	}
	printf("%d\n",nr);
	for(i=1;i<=nr;i++)
		printf("%d\n",rez[i]);

	return 0;
}