Cod sursa(job #163411)

Utilizator DorinOltean Dorin Dorin Data 22 martie 2008 10:08:46
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
# include <stdio.h>
# include <string>

using namespace std;

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

# define max 1001
# define maxM 10001

# define min(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( a[i][j] > f[i][j])
    			{
	    			coada[++dr] = j;
		    		t[j] = i;
		    		if(j == d) 	 return 1;
		    	}
		    	/*else
		    	   if(f[j][i] > 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;
		canal[i].x=x;
		canal[i].y=y;
	}

	while(bf(1,n))
	{
		r = INF;
		i=n;
		while(i!=1)
		{
            j = t[i];
            if(j < 0)
                r = min(r,f[i][-j]);
            else
               r = min( r,a[j][i] - f[j][i]);
          
            i=abs(j);
        }
        i = n;
        while(i!=1)
        {
           j = t[i];
/*           if(j < 0)
           {
              f[i][-j] -= r;
              f[-j][i] += r;
           }
           else
           {*/
              f[j][i] += r;
              f[i][j] -= r;
  //         }
           i = abs(j);
        }
	}

	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;
}