Cod sursa(job #256072)

Utilizator zbarniZajzon Barna zbarni Data 11 februarie 2009 00:26:05
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.51 kb
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define nmax 1005
    #define nx 10005
    #define min(x,y) ((x)<(y)?(x):(y))
    int flux[nmax][nmax], cap[nmax][nmax], X[nx],Y[nx];
    int n, m, x, y, z;
    int tat[nmax],*A[nmax],grad[nmax];
    int bfs()
     {
      int Q[nmax];
      memset(tat,0,sizeof(tat));
      Q[1]=1;
      tat[1]=1;
      for (int e=1,u=1;e<=u;e++)
       {
	int t=Q[e];
	for (int i=1;i<=A[t][0];++i)
	 if (!tat[A[t][i]] && cap[t][A[t][i]]>flux[t][A[t][i]])
	  {
	   tat[A[t][i]]=t;
	   Q[++u]=A[t][i];
	   if (A[t][i]==n)
	     return 1;
	  }
       }
      return 0;
     }

   void bfs1()
    {
     int Q[nmax];
     memset(tat,0,sizeof(tat));
     Q[1]=tat[1]=1;
     for (int e=1,u=1;e<=u;++e)
      {
       int t=Q[e];
       for (int i=1;i<=A[t][0];++i)
	if (!tat[A[t][i]] && cap[t][A[t][i]]>flux[t][A[t][i]])
	 {
	  tat[A[t][i]]=1;
	  Q[++u]=A[t][i];
	 }
      }
    }

   void bfs2()
    {
     int Q[nmax];
     Q[1]=n;
     tat[n]=2;
     for (int e=1,u=1;e<=u;++e)
      {
       int t=Q[e];
       for (int i=1;i<=A[t][0];++i)
	if (tat[A[t][i]]!=2 && cap[A[t][i]][t]>flux[A[t][i]][t])
	{
	  tat[A[t][i]]=2;
	  Q[++u]=A[t][i];
	 }
      }
    }

   void flux_maxim()
     {
      int r,j;
      while (bfs())
       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;
	 for (j = i; j != 1; j = tat[j])
	  {
	    flux[tat[j]][j] += r;
	    flux[j][tat[j]] -= r;
	  }
	}
     }
   int main()
     {
      freopen("critice.in","r",stdin);
      freopen("critice.out","w",stdout);
      scanf("%d %d", &n, &m);
      int i,k;
      for (i = 1; i <= m; i++)
       {
	scanf("%d %d %d", &x, &y, &z);
	cap[x][y] = z;
	cap[y][x] = z;
	X[i]=x;
	Y[i]=y;
	grad[x]++;
	++grad[y];
       }
      for (i=1;i<=n;++i)
       {
	A[i]=(int*)malloc((grad[i]+1)*sizeof(int));
	A[i][0]=0;
       }
      for (i=1;i<=m;++i)
	{
	 A[X[i]][++A[X[i]][0]]=Y[i];
	 A[Y[i]][++A[Y[i]][0]]=X[i];
	}
      flux_maxim();
      k=0;
      bfs1();bfs2();
      for (i=1;i<=m;++i)
       if (tat[X[i]]+tat[Y[i]]==3)
	 ++k;
      printf("%d\n",k);
      for (i=1;i<=m;++i)
       if (tat[X[i]]+tat[Y[i]]==3)
	 printf("%d\n",i);
      fclose(stdin);
      fclose(stdout);
      return 0;
     }