Cod sursa(job #183765)

Utilizator K0nTr0LBucatea Madalin Stefan K0nTr0L Data 22 aprilie 2008 16:03:56
Problema Critice Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<stdio.h>
#define N 1001
#define inf 0x3f3f3f3f
#define M 10001
int c[N],s[N],i,j,n,m,k,l,x,y,z,f[N],t[N],at[2][N],sol[M];
struct leg{
int i,c,nr;
leg *adr;
} *a[N],*p;
FILE *in,*out;

int ajunge(){
int p,u,i,j,l,cs;
leg *r;
for(i=1;i-n-1;i++)
 s[i]=1;
p=u=1;c[1]=1;s[1]=0;f[1]=inf;
while(p-u-1){
 i=c[p++];
  for(r=a[i];r!=0;r=r->adr)
    if(s[(j=r->i)]&&(cs=r->c)){
     c[++u]=j;s[j]=0;
      if(f[i]>=cs)
       f[j]=cs;
      else
       f[j]=f[i];
     t[j]=i;
      if(!(j-n))
       return 1;
    }
}
return 0;
}

void intoarce(){
int i,j;
leg *p;
i=n;
while(i-1){
 j=t[i];
  for(p=a[i];p->i-j;p=p->adr);
 p->c-=f[n];
  for(p=a[j];p->i-i;p=p->adr);
 p->c-=f[n];
 i=j;
}
}

void coada(int ss,int v){
int p,u,i,j;
leg *r;
for(i=1;i<=n;i++)
 s[i]=1;
p=u=1;c[1]=ss;s[ss]=0;
while(p-u-1){
 i=c[p++];
  for(r=a[i];r!=0;r=r->adr)
    if(r->c&&s[(j=r->i)]){
     c[++u]=j;
     s[j]=0;
    }
}
for(i=1;i<=n;i++)
  if(!s[i])
   at[v][i]=1;
}

int main(){
in=fopen("critice.in","rt");
out=fopen("critice.out","wt");
fscanf(in,"%d%d",&n,&m);
for(i=1;i-1-m;i++){
 fscanf(in,"%d%d%d",&x,&y,&z);
 p=new leg;p->i=y;p->c=z;p->nr=i;p->adr=a[x];a[x]=p;
 p=new leg;p->i=x;p->c=z;p->nr=i;p->adr=a[y];a[y]=p;
}
while(ajunge())
 intoarce();
coada(1,0);
coada(n,1);
l=0;
for(i=1;i<=n;i++)
  for(p=a[i];p!=0;p=p->adr)
    if((at[0][i]&&at[1][(j=p->i)])||(at[1][i]&&at[0][j]))
     sol[p->nr]=1,l++;
fprintf(out,"%d\n",l);
for(i=1;i<=m;i++)
  if(sol[i])
   fprintf(out,"%d\n",i);
return 0;
}