Cod sursa(job #373444)

Utilizator irene_mFMI Irina Iancu irene_m Data 13 decembrie 2009 20:24:34
Problema Critice Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.38 kb
#include <cstdio>
#include <string>
#define Max 0x3f3f3f3f
#define MaxN 1024
#define MaxM 10024

struct muchie{
      int x;
      muchie *urm;
}     *G[MaxN];

struct ord{
      int x,y;
}     p[MaxM];

int N,M,s[MaxN],uz[MaxN],a[MaxN][MaxN],f[MaxN],sol[MaxM],nr,sw=1,st,fi,min,c[MaxN];

void add(int x,int y)
{
      muchie *aux=new muchie;
      aux->x=y; aux->urm=G[x];
      G[x]=aux;
}

void cit()
{
      int i,x,y,c;
      freopen("critice.in","r",stdin);
      scanf("%d%d",&N,&M);
      for(i=1;i<=M;i++)
      {
            scanf("%d%d%d",&x,&y,&c);
            p[i].x=x; p[i].y=y;
            a[x][y]=a[y][x]=c;
            add(x,y); add(y,x);
      }
      st=1; fi=N;
}

inline int minim(int x,int y)
{
      if(x<y)
            return x;
      return y;
}

inline void gasesc_drum()
{
      int i,j,p=1,nodc,nod;
      muchie *q=new muchie;
      c[1]=st; uz[1]=1;
      for(j=1;j<=p && !f[N];j++)
      {
            nodc=c[j];
            q=G[nodc];
            while(q && !f[N])
            {
                  i=q->x;
                  if(f[i]==0 && a[nodc][i]>0)
                  {
                        f[i]=minim(a[nodc][i],f[nodc]);
                        s[i]=nodc;
                        c[++p]=i;
                        if(i==N)
                        {
                              j=p+1;
                              break;
                        }
                  }
                  q=q->urm;
            }
      }
      if(!f[N])
      {
            sw=0;
            return;
      }

      nod=N;
      while(nod!=st)
      {
            i=s[nod];
            a[i][nod]-=f[N];
            a[nod][i]+=f[N];
            nod=i;
      }
}

void flux()
{
      do{
            memset(f,0,sizeof(f));
            memset(s,-1,sizeof(s));
            f[st]=Max;
            gasesc_drum();
      }while(sw);
}


void bf1(int nod)
{
      int i,p=1,j,nodc;
      muchie *q=new muchie;
      memset(uz,0,sizeof(uz));

      c[p]=nod; uz[nod]=1;
      for(j=1;j<=p;j++)
      {
            nodc=c[j];
            s[nodc]=1;
            for(q=G[nodc]; q;q=q->urm)
            {
                  i=q->x;
                  if(a[nodc][i]>0 && !uz[i])
                  {
                        c[++p]=i;
                        uz[i]=1;
                  }
            }
      }
}

void bf2(int nod)
{
      int i,p=1,j,nodc;
      muchie *q=new muchie;
      memset(uz,0,sizeof(uz));

      c[p]=nod; uz[nod]=1;
      for(j=1;j<=p;j++)
      {
            nodc=c[j];
            s[nodc]=2;
            for(q=G[nodc]; q; q=q->urm)
            {
                  i=q->x;
                  if(a[i][nodc]>0 && !uz[i])
                  {
                        c[++p]=i;
                        uz[i]=1;
                  }
            }
      }
}


void rez()
{
      int i,x,y;
      memset(s,0,sizeof(s));
      bf1(1);
      bf2(N);

      for(i=1;i<=M;i++)
      {
            x=p[i].x; y=p[i].y;
            if( (!a[x][y] && a[y][x] || !a[y][x] && a[x][y]) && s[x]+s[y]==3)
                  sol[++nr]=i;
      }
}

void afis()
{
      freopen("critice.out","w",stdout);
      printf("%d\n",nr);
      for(int i=1;i<=nr;i++)
            printf("%d\n",sol[i]);
}

int main()
{
      cit();
      flux();
      rez();
      afis();
      return 0;
}