Cod sursa(job #290714)

Utilizator drag0shSandulescu Dragos drag0sh Data 28 martie 2009 16:11:37
Problema Critice Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.37 kb
#include <stdio.h>
#include <string.h>

#define NMAX 1002
#define NUME "critice"

FILE *in=fopen(NUME".in","r"),*out=fopen(NUME".out","w");

int f[NMAX][NMAX],c[NMAX][NMAX],q[NMAX],t[NMAX],n,m,flow,t2[NMAX];
short int v[NMAX],v2[NMAX];
struct muchie{
  int x,y;
};

muchie a[10002];

inline int min(int a,int b){return a<b?a:b;}
inline int abs(int a){return a>0?a:(-1)*a;}

int citire(){
  int i,z;
  fscanf(in,"%d%d",&n,&m);
  for(i=1;i<=m;i++){
    fscanf(in,"%d%d%d",&a[i].x,&a[i].y,&z);
    c[a[i].x][a[i].y]=z;
    c[a[i].y][a[i].x]=z;
  }
  return 0;
}

int bfs(){
  int p,u=0,nod;
  short int j;
   memset(t,0,sizeof(t));
  memset(q,0,sizeof(q));
  q[++u]=1;t[1]=-1;
  for(p=0;p<=u;){
    nod=q[++p];
    for(j=1;j<=n;j++){
      if(!t[j]&&c[nod][j]>f[nod][j])
	{
	q[++u]=j;
	t[j]=nod;
	if(j==n)return 1;
      }
    }
  }
  return 0; 
}
int bfs1(){
  int p,u=0,nod;
  short int j;
  //  memset(t,0,sizeof(t));
  memset(q,0,sizeof(q));
  q[++u]=1;v[1]=1;
  for(p=0;p<=u;){
    nod=q[++p];
    for(j=1;j<=n;j++){
      if(!v[j]&&c[nod][j]>abs(f[nod][j]))
	{
	q[++u]=j;
	v[j]=1;
	//	if(j==n)return 1;
      }
    }
  }
  return 0; 
}

int bfs2(){
  int p,u=0,nod;
  short int j;
  // memset(t2,0,sizeof(t));
  memset(q,0,sizeof(q));
  q[++u]=n;v2[n]=1;
  for(p=0;p<=u;){
    nod=q[++p];
    for(j=1;j<=n;j++){
      if(!v2[j]&&c[nod][j]>abs(f[nod][j]))
	{
	q[++u]=j;
	v2[j]=1;
	//	if(j==n)return 1;
      }
    }
  }
  return 0; 
}

void dinic(){
  int rez;
  short int i,j;
  for(;bfs();){
    for(i=1;i<=n;i++){
      if(c[i][n]<=f[i][n]||t[i]<=0)continue;
      rez=c[i][n]-f[i][n];
      for(j=i;j!=1;j=t[j])rez=min(rez,c[t[j]][j]-f[t[j]][j]);
      if(!rez)continue;
      f[i][n]+=rez;
      f[n][i]-=rez;
      for(j=i;j!=1;j=t[j])
	{
	  f[t[j]][j]+=rez;
	  f[j][t[j]]-=rez;
	}
      flow+=rez;
    }
  }
  
}

void afisare(){
  int nr=0;
  short i;
  bfs1();
  bfs2();
  for(i=1;i<=m;i++){
    if((v2[a[i].x]+v2[a[i].y]>=1)&&(v[a[i].x]+v[a[i].y]>=1)&&c[a[i].x][a[i].y]==abs(f[a[i].x][a[i].y]))nr++;
  }
  fprintf(out,"%d\n",nr);
  for(i=1;i<=m;i++){
    if((v2[a[i].x]+v2[a[i].y]>=1)&&(v[a[i].x]+v[a[i].y]>=1)&&c[a[i].x][a[i].y]==abs(f[a[i].x][a[i].y]))
      fprintf(out,"%d\n",i);
  }
}
int main(){
  citire();
  dinic();
  //  printf("(%d)",flow);
  //int i,j;
/*
  for(i=1;i<=n;i++){
    printf("\n");
    for(j=1;j<=n;j++) printf("%d ",f[i][j]);
  }
	  */
  afisare();

  fclose(in);
  fclose(out);
  return 0;
}