Cod sursa(job #43595)

Utilizator DorinOltean Dorin Dorin Data 30 martie 2007 12:09:21
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
# include <stdio.h>
# include <string>

using namespace std;

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

# define max 1001
# define maxM 10001

# 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[maxM];

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++)
	{/*
		x= canal[k].x;
		y= canal[k].y;

		if(f[x][y] == a[x][y])
		{
			int ok=0;
			if(x!=1)
				ok+=bf(1,x);
			else
				ok++;
			if(y!=n)
				ok+=bf(y,n);
			else
				ok++;
			if(ok == 2)
				rez[++nr] = k;
		}
		else
			if(f[y][x] == a[x][y])
			{
				int ok=0;
				if(y!=1)
					ok+=bf(1,y);
				else
					ok++;
				if(x!=n)
					ok+=bf(x,n);
				else
					ok++;
				if(ok == 2)
					rez[++nr] = 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;
}