Cod sursa(job #1585430)

Utilizator claudiuarseneClaudiu Arsene claudiuarsene Data 30 ianuarie 2016 23:49:09
Problema Critice Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 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;
}