Cod sursa(job #309001)

Utilizator mlazariLazari Mihai mlazari Data 29 aprilie 2009 11:12:50
Problema Cuplaj maxim in graf bipartit Scor 20
Compilator cpp Status done
Runda tot Marime 0.86 kb
#include<stdio.h>
#define NMAX 10001

struct lista {
  int x;
  lista *next;
};

int i,k=0,n,m,e,a,b,g[NMAX],r[NMAX];
lista* v[NMAX];
lista *q,*qm;

void init() {
  for(int i=1;i<=n;i++) { v[i]=NULL; r[i]=0; }
  for(int i=1;i<=m;i++) g[i]=0;
}

void add(int a,int b) {
  lista *q=new lista;
  q->x=b;
  q->next=v[a];
  v[a]=q;
  g[b]++;
}

int main() {
  freopen("cuplaj.in","r",stdin);
  freopen("cuplaj.out","w",stdout);
  scanf("%d %d %d",&n,&m,&e);
  init();
  for(i=0;i<e;i++) {
    scanf("%d %d",&a,&b);
    add(a,b);
  }
  for(i=1;i<=n;i++) {
    q=qm=v[i];
    while(q) {
     if(!g[qm->x] || g[q->x]&&(g[q->x]<g[qm->x])) qm=q;
     q=q->next;
    }
    if(qm && g[qm->x]) { r[i]=qm->x; g[qm->x]=0; k++; }
  }
  printf("%d\n",k);
  for(i=1;i<=n;i++)
   if(r[i]) printf("%d %d\n",i,r[i]);
  fclose(stdout);
  return 0;
}