Cod sursa(job #74696)

Utilizator VmanDuta Vlad Vman Data 27 iulie 2007 13:03:29
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.55 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,f[Nmax][Nmax],parinte[Nmax],aux[Nmax],x[Mmax],y[Mmax],c,p,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);
     g[x[i]].push_back(y[i]);
     g[y[i]].push_back(x[i]);
     f[x[i]][y[i]]=f[y[i]][x[i]]=c;
     }
}

int bfs()
{
vector<int> coada(Nmax);
vector<int>::iterator i,st;
coada.push_back(1);
st=coada.begin();
memset(parinte,0,sizeof(parinte));
parinte[1]=1;
while ((st<coada.end())&&(parinte[N]==0))
      {
      for (i=g[*st].begin();i<g[*st].end() && parinte[N]==0;++i)
          if ((f[*st][*i]!=0)&&(parinte[*i]==0))
             {
             coada.push_back(*i);
             parinte[*i]=*st;
             }
             else if (f[*st][*i]==0) { g[*st].erase(i); --i; }
      ++st;
      }
return parinte[N];
}

void flux()
{
int cmin=infinit;
while ( bfs() )
      {
      p=N;
      while (parinte[p]!=p)
            {
            if (f[parinte[p]][p]<cmin) cmin=f[parinte[p]][p];
            p=parinte[p];
            }
      p=N;
      while (parinte[p]!=p)
            {
            f[parinte[p]][p]-=cmin;
            f[p][parinte[p]]-=cmin;
            p=parinte[p];
            }
      }
}

void bfs_source()
{
int coada[Nmax],st,dr,i;
coada[st=dr=1]=1;
aux[1]=1;
while (st<=dr)
      {
      for (i=0;i<g[coada[st]].size();++i)
          if ((f[coada[st]][g[coada[st]][i]]!=0)&&(aux[g[coada[st]][i]]==0))
             {
             coada[++dr]=g[coada[st]][i];
             aux[coada[dr]]=1;
             }
      ++st;
      }
}

void bfs_destination()
{
int coada[Nmax],st,dr,i;
coada[st=dr=1]=N;
memset(parinte,0,sizeof(parinte));
parinte[N]=1;
while (st<=dr)
      {
      for (i=0;i<g[coada[st]].size();++i)
          if ((f[coada[st]][g[coada[st]][i]]!=0)&&(parinte[g[coada[st]][i]]==0))
             {
             coada[++dr]=g[coada[st]][i];
             parinte[coada[dr]]=1;
             }
      ++st;
      }
}

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