Cod sursa(job #138393)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 18 februarie 2008 16:07:24
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.18 kb
/* Ivan Nicolae - Critice - Infoarena */
#include <stdio.h>
#include <string.h>

#define NMAX 1001
#define MMAX 10001
#define INPUT  "critice.in"
#define OUTPUT "critice.out"
#define Infinity (0x3f3f3f3f)

int i,j,n,m,Cap[NMAX][NMAX],Flux[NMAX][NMAX],DRez[NMAX];
int C[NMAX],up[NMAX],Mark[NMAX],unu[NMAX],doi[NMAX],Much[MMAX][2];
int A[NMAX][NMAX];

#define old (C[st])

void GetDrumRez(int S, int D)
{
 int i,st=0,end,poz=0,j;
 for (i=1;i<=n;i++)
    C[i]=up[i]=Mark[i]=0;
 C[++st]=S; up[st]=0; end=1; Mark[S]=1;
 for (st=1;st<=end;st++)
    {
     for (j=1;j<=A[old][0];j++)
        if (!Mark[A[old][j]] && Cap[old][A[old][j]]-Flux[old][A[old][j]]>0)
          {
           C[++end]=A[old][j];
           up[end]=st;
           Mark[A[old][j]]=1;
           if (A[old][j]==D) { poz=end; break; }
          }
     if (poz==end) break;
    }
 while (poz)
      {
       DRez[++DRez[0]]=C[poz];
       poz=up[poz];
      }
}

#define back  (DRez[i+1])
#define front (DRez[i])

int GetFlux(int S, int D)
{
 int gasit=1,i;
 while (gasit)
      {
       for (i=1;i<=DRez[0];i++) DRez[i]=0; DRez[0]=0;
       GetDrumRez(S,D);
       if (!DRez[0])
         gasit=0;
         else {
               int md=Infinity;
               for (i=DRez[0]-1;i>=1;i--)
                  if (Cap[back][front]-Flux[back][front]<md)
                    md=Cap[back][front]-Flux[back][front];
               for (i=DRez[0]-1;i>=1;i--)
                  {
                   Flux[back][front]+=md;
                   Flux[front][back]-=md;
                  }
              }
      }
 int Fluxu=0;
 return Fluxu;
}

void BFS(int S, int unu[])
{
 int i,st,end,j,x=1;
 memset(C,0,sizeof(C));
 C[1]=S; st=1; end=1; unu[S]=x;
 for (st=1;st<=end;st++)
    {
     for (j=1;j<=n;j++)
        if (Cap[C[st]][j]-Flux[C[st]][j]>0 && unu[j]!=x)
          {
           C[++end]=j;
           unu[j]=x;
          }
    }
}

void BFS2(int S, int unu[])
{
 int i,st,end,j,x=1;
 memset(C,0,sizeof(C));
 C[1]=S; st=1; end=1; unu[S]=x;
 for (st=1;st<=end;st++)
    {
     for (j=1;j<=n;j++)
        if (Cap[j][C[st]]-Flux[j][C[st]]>0 && unu[j]!=x)
          {
           C[++end]=j;
           unu[j]=x;
          }
    }
}

int main()
{
 freopen(INPUT,"r",stdin);
 freopen(OUTPUT,"w",stdout);

 scanf("%d%d",&n,&m);

 for (i=1;i<=m;i++)
    {
     int x,y,c;
     scanf("%d%d%d",&x,&y,&c);
     Much[i][0]=x; Much[i][1]=y;
     Cap[x][y]=c; Cap[y][x]=c;
     A[x][++A[x][0]]=y;
     A[y][++A[y][0]]=x;
    }

 int Fmax=GetFlux(1,n);

 BFS(1,unu);
 BFS2(n,doi);

 int rez=0;
 for (i=1;i<=m;i++)
    {
     int x,y;
     x=Much[i][0];
     y=Much[i][1];
     if (unu[x] && doi[y] && Cap[x][y]-Flux[x][y]==0)
       { rez++;}
       else
     if (doi[x] && unu[y] && Cap[y][x]-Flux[y][x]==0)
       { rez++;}
    }

 printf("%d\n",rez);
 for (i=1;i<=m;i++)
    {
     int x,y;
     x=Much[i][0];
     y=Much[i][1];
     if (unu[x] && doi[y] && Cap[x][y]-Flux[x][y]==0)
       { printf("%d\n",i);}
       else
     if (doi[x] && unu[y] && Cap[y][x]-Flux[y][x]==0)
       { printf("%d\n",i);}
    }

 fclose(stdin);
 fclose(stdout);
 return 0;
}