Cod sursa(job #255989)

Utilizator zbarniZajzon Barna zbarni Data 10 februarie 2009 22:11:05
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>  
    #define nmax 1005
    #define nx 10005
    #define min(x,y) ((x)<(y)?(x):(y))
    int flux[nmax][nmax], cap[nmax][nmax], poz[nmax][nmax];
    int n, m, x, y, z,w;
    int tat[nmax];
    struct ek
     {
      int e1,e2,pos;
     };
    ek Q[nx];
    int compare (const void *a,const void *b)
     {
      return (((ek*)a)->pos-((ek*)b)->pos);
     }
   int bfs(int s, int d)
     {
      int que[nmax];
      memset(tat,0,sizeof(tat));
      tat[que[0] = 1] = -1;
      for (int p = 0, u = 0; p <= u; p++)
	for (int i = 1, nod = que[p]; i <= n; i++)
	  if (!tat[i] && cap[nod][i] > flux[nod][i])
	      {
		   tat[que[++u] = i] = nod;
		   if (i == d)
		       return 1;
	      }
      return 0;
     }
   int bfs1(int d1,int d2)
    {
     int que[nmax];
     memset(tat,0,sizeof(tat));
     tat[que[0] = 1] = 1;
      for (int p = 0, u = 0; p <= u; p++)
	for (int i = 1, nod = que[p]; i < n; i++)
	  if (!tat[i] && cap[nod][i] > flux[nod][i] || d1==1 || d2==1)
	      {
		   tat[que[++u] = i] = 1;
		   if (i == d1)
		    return d2;
		   if (i==d1)
		    return d2;
	      }
      return 0;
     }
   int bfs2(int s)
    {
     if (!s) return 0;
     int que[nmax];
     que[0]=s;
     tat[s]=1;
     for (int p=0,u=0; p<=u;++p)
      for (int i=1,nod=que[p];i<=n;++i)
	if (!tat[i] && cap[nod][i]>flux[nod][i])
	 {
	  tat[que[++u]=i]=1;
	  if (i == n)
	    return 1;
	 }
     return 0;
    }
   int flux_maxim()
     {
      int r,j;
      for (; bfs(1, n); )
       for (int i = 1; i <= n; i++)
	{
	 if (tat[i] <= 0 || cap[i][n] <= flux[i][n])
	   continue;
	 r = cap[i][n] - flux[i][n];
	 for (j = i; j != 1; j = tat[j])
	   r = min(r, cap[tat[j]][j] - flux[tat[j]][j]);
	 if (!r)
	   continue;
	 flux[i][n] += r;
	 flux[n][i] -= r;
	 if (flux[i][n]==cap[i][n] && cap[i][n])
	  { Q[++w].e1=i;
	    Q[w].e2=n;
	    Q[w].pos=poz[i][n]; }
	 for (j = i; j != 1; j = tat[j])
	  {
	    flux[tat[j]][j] += r;
	    flux[j][tat[j]] -= r;
	    if (flux[tat[j]][j]==cap[tat[j]][j] && cap[tat[j]][j])
	      { Q[++w].e1=tat[j];
		Q[w].e2=j;
		Q[w].pos=poz[tat[j]][j]; }
	  }
	}
     }

   int main()
     {
      freopen("critice.in","r",stdin);
      freopen("critice.out","w",stdout);
      scanf("%d %d", &n, &m);
      int k=0,i;
      for (i = 0; i < m; i++)
       {
	scanf("%d %d %d", &x, &y, &z);
	cap[x][y] = z;
	cap[y][x] = z;
	poz[x][y] = ++k;
	poz[y][x] = k;
       }
      flux_maxim();
      k=0;
      int asd[nmax]={0};
      qsort(Q,w+1,sizeof(ek),compare);
      for (i=1;i<=w;++i)
	if (bfs2(bfs1(Q[i].e1,Q[i].e2)))
	   asd[++k]=i;
      printf ("%d\n",k);
      for (i=1;i<=k;++i)
	printf("%d\n",Q[asd[i]].pos);
      fclose(stdin);
      fclose(stdout);
       return 0;
     }