Cod sursa(job #285027)

Utilizator drag0shSandulescu Dragos drag0sh Data 22 martie 2009 11:57:54
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10001
FILE *f=fopen("cuplaj.in","r"),*out=fopen("cuplaj.out","w");

int *g[N];
int s[N],d[N],v[N],n,m;

void citire(){
  int x,y,nr,i;
  fscanf(f,"%d%d%d",&n,&m,&nr);
  for(i=1;i<=n;i++){g[i]=(int*)realloc(g[i],sizeof(int));g[i][0]=0;}
  
  while(nr--){
    fscanf(f,"%d%d",&x,&y);
    g[x][0]++;
    g[x]=(int*)realloc(g[x],sizeof(int)*(g[x][0]+1));
    g[x][g[x][0]]=y;
  }
}

int cupleaza(int o){
  
  if(v[o])return 0;
  v[o]=1;
  int x;
  for(x=1;x<=g[o][0];x++){
    if(!d[g[o][x]]){
      s[o]=g[o][x];
      d[g[o][x]]=o;
      return 1;

    }
  }
  for(x=1;x<=g[o][0];x++)
    if(cupleaza(d[g[o][x]])) {
	s[o]=g[o][x];
	d[g[o][x]]=o;
	return 1;
      }
  return 0;
}




int main(){
  citire();
  int stare=1,i,nr=0;
  while(stare){
    memset(v,0,sizeof(v));
    stare=0;
    for(i=1;i<=n;i++)
      if(!s[i]) stare|=cupleaza(i);
  }
  for(i=1;i<=n;i++)if(s[i]>0)nr++;
  fprintf(out,"%d\n",nr++);
  for(i=1;i<=n;i++)if(s[i]>0)fprintf(out,"%d %d\n",i,s[i]);
  fclose(f);
  fclose(out);
  return 0;
}