Cod sursa(job #173926)

Utilizator DorinOltean Dorin Dorin Data 8 aprilie 2008 12:02:17
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
# include <stdio.h>
# include <string.h>

using namespace std;

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

# define max 1001
# define maxM 10001

# define minim(a,b) (a<b?a:b)
# define abs(a) (a<0?-a:a)

# 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,k;

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

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])
                if( f[i][j] > 0)
    			{
	    			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;
		f[x][y] = c;
		f[y][x] = c;
		canal[i].x=x;
		canal[i].y=y;
	}

	while(bf(1,n))
	{
		r = INF;
		i=n;
		while(i!=1)
		{
		   j = t[i];
		    r = minim(r,f[j][i]);
		    i =  j;
		}
	i = n;
	while(i!=1)
	{
           j = t[i];
           f[j][i] -= r;
           f[i][j] += r;
           i = j;
        }
	}

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

	return 0;
}