Cod sursa(job #74508)

Utilizator VmanDuta Vlad Vman Data 26 iulie 2007 00:05:42
Problema Critice Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.5 kb
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;

#define Nmax 1001
#define Mmax 10001
#define infinit 100000000

int N,M,i,x[Mmax],y[Mmax],c[Mmax],parinte[Nmax],target[Nmax],nr;
vector<int> g[Nmax];

void citire()
{
 freopen("critice.in","r",stdin);
 scanf("%d %d",&N,&M);
 for (i=1;i<=M;++i)
     {
     scanf("%d %d %d",&x[i],&y[i],&c[i]);
     g[x[i]].push_back(i);
     g[y[i]].push_back(i);
     }
 fclose(stdout);
}

int bfs()
{
int coada[Nmax],st,dr,i;
coada[st=dr=1]=1;
memset(parinte,0,sizeof(parinte));
parinte[1]=-1;
while ((st<=dr)&&(parinte[N]==0))
      {
       for (i=0;i<g[coada[st]].size() && parinte[N]==0;++i)
           if (x[g[coada[st]][i]]==coada[st])
              if ((parinte[y[g[coada[st]][i]]]==0)&&(c[g[coada[st]][i]]>0))
                 {
                 coada[++dr]=y[g[coada[st]][i]];
                 parinte[coada[dr]]=g[coada[st]][i];
                 }
                 else ;
            else
              if ((parinte[x[g[coada[st]][i]]]==0)&&(c[g[coada[st]][i]]>0))
                 {
                 coada[++dr]=x[g[coada[st]][i]];
                 parinte[coada[dr]]=g[coada[st]][i];
                 }
      ++st;
      }
return parinte[N];
}

void bfs1()
{
int coada[Nmax],st,dr,i;
coada[st=dr=1]=1;
memset(parinte,0,sizeof(parinte));
parinte[1]=1;
while (st<=dr)
      {
       for (i=0;i<g[coada[st]].size();++i)
           if (x[g[coada[st]][i]]==coada[st])
              if ((parinte[y[g[coada[st]][i]]]==0)&&(c[g[coada[st]][i]]>0))
                 {
                 coada[++dr]=y[g[coada[st]][i]];
                 parinte[coada[dr]]=1;
                 }
                 else ;
            else
              if ((parinte[x[g[coada[st]][i]]]==0)&&(c[g[coada[st]][i]]>0))
                 {
                 coada[++dr]=x[g[coada[st]][i]];
                 parinte[coada[dr]]=1;
                 }
      ++st;
      }
}

void bfsN()
{
int coada[Nmax],st,dr,i;
coada[st=dr=1]=N;
memset(target,0,sizeof(parinte));
target[N]=1;
while (st<=dr)
      {
       for (i=0;i<g[coada[st]].size();++i)
           if (x[g[coada[st]][i]]==coada[st])
              if ((target[y[g[coada[st]][i]]]==0)&&(c[g[coada[st]][i]]>0))
                 {
                 coada[++dr]=y[g[coada[st]][i]];
                 target[coada[dr]]=1;
                 }
                 else ;
            else
              if ((target[x[g[coada[st]][i]]]==0)&&(c[g[coada[st]][i]]>0))
                 {
                 coada[++dr]=x[g[coada[st]][i]];
                 target[coada[dr]]=1;
                 }
      ++st;
      }
}


void flux()
{
 int p,cmin=infinit;
 while ( bfs() )
       {
        p=N;
        while (parinte[p]!=-1)
              {
               if (c[parinte[p]]<cmin) cmin=c[parinte[p]];
               if (x[parinte[p]]==p) p=y[parinte[p]];
                  else p=x[parinte[p]];
              }
        p=N;
        while (parinte[p]!=-1)
              {
               c[parinte[p]]-=cmin;
               if (x[parinte[p]]==p) p=y[parinte[p]];
                  else p=x[parinte[p]];
              }
       }
}

int main()
{
 citire();
 flux();
 bfs1();
 bfsN();
 freopen("critice.out","w",stdout);
 printf("             \n");
 for (i=1;i<=M;++i)
     if ((parinte[x[i]]+target[y[i]]==2)||(parinte[y[i]]+target[x[i]]==2))
        {
        printf("%d\n",i);
        ++nr;
        }
 fseek(stdout,0,SEEK_SET);
 printf("%d",nr);
 fclose(stdout);
 return 0;
}