Cod sursa(job #26090)

Utilizator moga_florianFlorian MOGA moga_florian Data 5 martie 2007 10:17:32
Problema Critice Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 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;        
}