Cod sursa(job #184256)

Utilizator K0nTr0LBucatea Madalin Stefan K0nTr0L Data 23 aprilie 2008 12:52:44
Problema Critice Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<stdio.h>
#define inf 0x3f3f3f3f
#define N 1001
struct leg{
int i,j,c;
} a[10101],r;
int cr[N],at[2][N],cap[N][N],f[N][N],c[N],s[N],t[N],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]=0;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]&&cap[i][j]>f[j][i])
     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(j==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())>0)
 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();
coada(1,0);
coada(n,1);
p=0;
for(i=1;i<=m;i++)
  if((a[i].c==f[a[i].i][a[i].j]||a[i].c==f[a[i].j][a[i].i])&&(((at[0][a[i].i]&at[1][a[i].j])&&!(at[1][a[i].i]|at[0][a[i].j]))||((at[0][a[i].j]&at[1][a[i].i])&&!(at[1][a[i].j]|at[0][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;
}