Cod sursa(job #184255)

Utilizator K0nTr0LBucatea Madalin Stefan K0nTr0L Data 23 aprilie 2008 12:51:44
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include<stdio.h>
#define min(a,b) ((a<=b)?a:b)
#define inf 0x3f3f3f3f
#define N 1001
#define M 10001
struct leg{
int i,nr;
} a[N][N];
int t[N],s[N],cr[N],c[N],i,j,n,m,k,l,p,x,y,z,at[2][N],cap[N][N],sol[M];
FILE *in,*out;

int atinge(){
int p,u,i,j,k,l;
for(i=1;i-n-1;i++)
 s[i]=1,cr[i]=0;
p=u=1;c[1]=1;s[1]=0;cr[1]=inf;
while(p-u-1){
 i=c[p++];
  for(j=1;j-a[i][0].i-1;j++)
    if(s[(l=a[i][j].i)]&&cap[i][l]){
     c[++u]=l;t[l]=i;s[l]=0;
     cr[l]=min(cr[i],cap[i][l]);
      if(l-n)
       continue;
     return cr[n];
    }
}
return 0;
}

void intoarce(int v){
int i,j,l;
i=n;
while(i-1){
 j=t[i];
 cap[j][i]-=v;cap[i][j]+=v;
 i=j;
}
}

void coada(int ss,int v){
int p,u,i,j,l;
for(i=1;i-n-1;i++)
 s[i]=1;
p=u=1;c[1]=ss;s[ss]=0;t[ss]=0;at[v][ss]=1;
while(p-u-1){
 i=c[p++];
  for(j=1;j-a[i][0].i-1;j++)
    if(s[(l=a[i][j].i)]&&cap[i][l]&&cap[l][i]){
     c[++u]=l;s[l]=0;at[v][l]=1;
    }
}
}

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