Cod sursa(job #165748)

Utilizator K0nTr0LBucatea Madalin Stefan K0nTr0L Data 26 martie 2008 19:00:46
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<stdio.h>
#define inf 0x3f3f3f3f
struct leg{
int i,j,c;
} a[10001],r;
int cr[1001],at[2][1001],cap[1001][1001],f[1001][1001],c[1001],s[1001],t[1001],i,j,n,m,k,l,p,ft;
FILE *in,*out;

void coada(int ss,int v){
int p,u,i,j;
for(i=1;i<=n;i++)
 s[i]=1,at[v][i]=0;
p=u=1;c[1]=ss;s[ss]++;at[v][ss]=1;
while(p<=u){
 i=c[p++];
  for(j=1;j<=n;j++)
    if(s[j]&&cap[i][j]>f[i][j])
     c[++u]=j,s[j]=0,at[v][j]=1;
}
}

int ajunge(){
int p,u,i,j,l;
for(i=1;i<=n;i++)
 s[i]=1;
p=u=1;c[1]=1;s[1]=0;cr[1]=inf;
while(p<=u){
 i=c[p++];
  for(j=1;j<=n;j++)
    if(s[j]&&(l=cap[i][j]-f[i][j])>0){
     c[++u]=j,s[j]=0,t[j]=i;
      if(cr[i]>l)
       cr[j]=l;
      else
       cr[j]=cr[i];
    }
}
if(!s[n])
 return cr[n];
return 0;
}

void intoarce(int v){
int i;
for(i=n;i!=1;i=t[i])
 f[t[i]][i]+=v,f[i][t[i]]+=v;
}

int flux(){
int ss=0;
int l;
while(l=ajunge())
 ss+=l,intoarce(l);
return ss;
}

int main(){
in=fopen("critice.in","rt");
out=fopen("critice.out","wt");
fscanf(in,"%d%d",&n,&m);
for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   cap[i][j]=-3;
for(i=1;i<=m;i++)
 fscanf(in,"%d%d%d",&a[i].i,&a[i].j,&a[i].c),cap[a[i].i][a[i].j]=a[i].c,cap[a[i].j][a[i].i]=a[i].c;
ft=flux();
for(i=1;i<=n;i++)
 cr[i]=0;
coada(1,0);
coada(n,1);
p=0;
for(i=1;i<=n;i++)
 s[i]=0;
for(i=1;i<=m;i++)
  if(a[i].c==f[a[i].i][a[i].j]&&((at[0][a[i].i]&at[1][a[i].j])||(at[0][a[i].j]&at[1][a[i].i])))
   s[++p]=i;
fprintf(out,"%d\n",p);
for(i=1;i<=p;i++)
 fprintf(out,"%d\n",s[i]);
return 0;
}