Cod sursa(job #112250)

Utilizator stef2nStefan Istrate stef2n Data 3 decembrie 2007 23:08:49
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include<stdio.h>
typedef struct NOD{int x; struct NOD *adr;};
typedef struct {int u,v;}muchie;
FILE *fin,*fout;
muchie *M=new muchie [10005];
int m,n,cap[1005][1005];
int vizitat[1005], coada[1005], prec[1005];
int start,end,nrsol=0,sol[10005];

void adaug_st(NOD *(&prim), int inf)
  {NOD *a=new NOD;
   a->x=inf;
   a->adr=prim;
   prim=a;}

void citire(NOD *(&prim)[1005])
  {int i;
   fin=fopen("critice.in","r");
   fscanf(fin,"%d %d",&n,&m);
   for(i=0;i<n;i++)
      prim[i]=NULL;
   for(i=0;i<m;i++)
     {int c;
      fscanf(fin,"%d %d %d",&M[i].u,&M[i].v,&c);
      M[i].u--;
      M[i].v--;
      adaug_st(prim[M[i].u],M[i].v);
      adaug_st(prim[M[i].v],M[i].u);
      cap[M[i].u][M[i].v]=cap[M[i].v][M[i].u]=c;}
   fclose(fin);}

void bf(NOD *prim[1005])
  {int i;
   NOD *b;
   start=end=0;
   for(i=1;i<n;i++)
      vizitat[i]=0;
   vizitat[0]=1;
   coada[0]=0;
   prec[0]=-1;
   while(start<=end)
       {b=prim[coada[start]];
        while(b)
            {if(!vizitat[b->x] && cap[coada[start]][b->x])
               {coada[++end]=b->x;
                prec[b->x]=coada[start];
                vizitat[b->x]=1;
                if(b->x==n-1)
                  return;}
             b=b->adr;}
        start++;}}

void edmonds_karp(NOD *prim[1005])
  {do{bf(prim);
      if(vizitat[n-1])
        {int v=n-1,u,min=100000;
         while(prec[v]!=-1)
             {u=prec[v];
              if(cap[u][v]<min)
                min=cap[u][v];
              v=u;}
         v=n-1;
         while(prec[v]!=-1)
             {u=prec[v];
              cap[u][v]-=min;
              cap[v][u]+=min;
              v=u;}}
     }while(vizitat[n-1]);}

void df1(NOD *prim[1005], int varf)
  {NOD *b=prim[varf];
   while(b)
       {if(cap[varf][b->x] && !vizitat[b->x])
          {vizitat[b->x]=1;
           df1(prim,b->x);}
        b=b->adr;}}

void df2(NOD *prim[1005], int varf)
  {NOD *b=prim[varf];
   while(b)
       {if(cap[b->x][varf] && !vizitat[b->x])
          {vizitat[b->x]=2;
           df2(prim,b->x);}
        b=b->adr;}}

void critice(NOD *prim[1005])
  {int i;
   for(i=0;i<n;i++)
      vizitat[i]=0;
   vizitat[0]++;
   vizitat[n-1]|=2;
   df1(prim,0);
   df2(prim,n-1);
   for(i=0;i<m;i++)
     {int u=M[i].u,v=M[i].v;
      if(!cap[u][v] && (vizitat[u]&1) && (vizitat[v]>>1))
        sol[nrsol++]=i+1;
      else if(!cap[v][u] && (vizitat[u]>>1) && (vizitat[v]&1))
             sol[nrsol++]=i+1;}}

void scriere_solutie()
  {fout=fopen("critice.out","w");
   fprintf(fout,"%d\n",nrsol);
   for(int i=0;i<nrsol;i++)
      fprintf(fout,"%d\n",sol[i]);
   fclose(fout);}


int main()
{
NOD *prim[1005];
citire(prim);
edmonds_karp(prim);
critice(prim);
scriere_solutie();
return 0;
}