Cod sursa(job #133721)

Utilizator Darth_NiculusIvan Nicolae Darth_Niculus Data 9 februarie 2008 16:13:43
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.89 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,G[NMAX][NMAX],Cap[NMAX][NMAX],Flux[NMAX][NMAX],DRez[NMAX];
int C[NMAX],up[NMAX],Mark[NMAX],unu[NMAX],doi[NMAX],SOL[MMAX];

#define old (C[st])

void GetDrumRez(int S, int D)
{
 int i,st=0,end,poz=0,j;
 memset(C,0,sizeof(C));
 memset(up,0,sizeof(up));
 memset(Mark,0,sizeof(Mark));
 C[++st]=S; up[st]=0; end=1;
 for (st=1;st<=end;st++)
    {
     for (j=1;j<=n;j++)
        if (!Mark[j] && Cap[old][j]-Flux[old][j]>0)
          {
           C[++end]=j;
           up[end]=st;
           Mark[j]=1;
           if (j==D) poz=end;
          }
    }
 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)
      {
       memset(DRez,0,sizeof(DRez));
       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;
 for (i=1;i<=n;i++)
    if (Flux[i][D])
      Fluxu+=Flux[i][D];
 return Fluxu;
}

void BFS(int S, int A[])
{
 int i,st,end,j;
 memset(C,0,sizeof(C));
 memset(Mark,0,sizeof(Mark));
 C[1]=S; st=1; end=1; A[1]=1;
 for (st=1;st<=end;st++)
    {
     for (j=1;j<=n;j++)
        if (G[C[st]][j] && !Mark[j])
          {
           C[++end]=j;
           Mark[j]=1;
           A[j]=1;
          }
    }
}

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);
     Cap[x][y]=c; Cap[y][x]=c;
    }

 int Fmax=GetFlux(1,n);

 for (i=1;i<=n;i++)
 for (j=1;j<=n;j++)
    if (Cap[i][j]-Flux[i][j]>0)
      G[i][j]=1;

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

 fseek(stdin,0,SEEK_SET);

 int rez=0;
 scanf("%d%d",&n,&m);
 for (i=1;i<=m;i++)
    {
     int x,y,c;
     scanf("%d%d%d",&x,&y,&c);
     if (G[x][y] && unu[x] && doi[y])
       { rez++; SOL[++SOL[0]]=i; }
       else
     if (G[x][y] && doi[x] && unu[y])
       { rez++; SOL[++SOL[0]]=i; }
       else
     if (G[y][x] && doi[x] && unu[y])
       { rez++; SOL[++SOL[0]]=i; }
       else
     if (G[y][x] && unu[x] && doi[y])
       { rez++; SOL[++SOL[0]]=i; }
    }

 printf("%d\n",rez);
 for (i=1;i<=SOL[0];i++)
    printf("%d\n",SOL[i]);

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