Cod sursa(job #141158)

Utilizator SycronVene Tian Sycron Data 22 februarie 2008 20:03:48
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.56 kb
#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;   
}