Cod sursa(job #162925)

Utilizator FlorinC1996Florin C FlorinC1996 Data 20 martie 2008 22:03:47
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.66 kb
 using namespace std;   
#include<stdio.h>   
#include<fstream>   
  
int m,n,a[1005][1005],vec[1005][1005],nvec[1005];   
int viz[1005];   
int nod[1005],t[1005],flux[1005];   
  
int main()   
{   
FILE *fin=fopen("critice.in","r"),*fout=fopen("critice.out","w");   
fscanf(fin,"%d%d",&n,&m);   
int x,y,r,i;   
for(i=1;i<=n;i++) nvec[i]=0;   
for(i=1;i<=m;i++)   
  {   
  fscanf(fin,"%d%d%d",&x,&y,&r);                  
  vec[x][++nvec[x]]=y;   
  vec[y][++nvec[y]]=x;   
  a[x][y]=a[y][x]=r;   
  }   
     
//drumuri de creshtere cu BFS   
int li,lf,k,nc;   
  
do{   
memset(viz,0,sizeof viz);   
li=lf=1;   
nod[1]=1;   
viz[1]=1;   
flux[1]=100000;   
while(li<=lf&&nod[lf]!=n)   
   {   
   nc=nod[li];   
   for(k=1;k<=nvec[nc];k++)    
      if(viz[vec[nc][k]]==0&&a[nc][vec[nc][k]]>0)   
       {   
       viz[vec[nc][k]]=1;   
       nod[++lf]=vec[nc][k];   
       t[nod[lf]]=nod[li];   
       if(a[nc][vec[nc][k]]<flux[li])   
           flux[lf]=a[nc][vec[nc][k]];   
       else  
           flux[lf]=flux[li];   
          
       if(nod[lf]==n)   
          break;              
       }   
   li++;   
   }   
  
if(nod[lf]==n)      
     k=n;   
else    
     k=1;   
  
while(k!=1)   
  {   
  a[t[k]][k]-=flux[lf];   
  a[k][t[k]]+=flux[lf];            
  k=t[k];   
  }        
     
}while(nod[lf]==n);   
  
int grup[1005],c[1005];      
memset(grup,0,sizeof grup);   
memset(viz,0,sizeof viz);   
//de la stanga la dreapta   
li=lf=1;   
c[1]=1;   
viz[1]=1;   
while(li<=lf)    
   {   
    grup[c[li]]=1;   
       
    for(k=1;k<=nvec[c[li]];k++)   
       if(viz[vec[c[li]][k]]==0&&a[c[li]][vec[c[li]][k]]>0)   
          {   
          c[++lf]=vec[c[li]][k];             
          viz[c[lf]]=1;   
          }   
    li++;   
    }   
       
//de la dreapta la stanga   
li=lf=1;   
c[1]=n;   
if(!viz[n])   
   viz[n]=1;   
else  
   lf=0;   
      
while(li<=lf)   
  {   
  grup[c[li]]=2;   
  for(k=1;k<=nvec[c[li]];k++)   
      if(viz[vec[c[li]][k]]==0&&a[vec[c[li]][k]][c[li]]>0)   
          {   
          c[++lf]=vec[c[li]][k];   
          viz[c[lf]]=1;                                                   
          }     
  li++;            
  }       
  
int sol[10005],nsol=0;   
freopen("critice.in","r",fin);   
fscanf(fin,"%d%d",&n,&m);   
for(i=1;i<=m;i++)   
  {   
  fscanf(fin,"%d%d%d",&x,&y,&r);   
  if(grup[x]&&grup[y]&&grup[x]!=grup[y])    
     sol[++nsol]=i;                  
  }    
     
fprintf(fout,"%d\n",nsol);   
for(i=1;i<=nsol;i++)   
  fprintf(fout,"%d\n",sol[i]);   
  
fclose(fin);   
fclose(fout);   
return 0;           
}