Cod sursa(job #332989)

Utilizator mlazariLazari Mihai mlazari Data 21 iulie 2009 10:06:24
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<stdio.h>

#define NMAX 10003

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

lista *v[NMAX];
int n,m,e,nc=0,l[NMAX],r[NMAX],u[NMAX];

void add(lista* &l,int x) {
  lista *q=new lista;
  q->x=x;
  q->next=l;
  l=q;
}

void citeste() {
  int a,b,i;
  freopen("cuplaj.in","r",stdin);
  scanf("%d %d %d",&n,&m,&e);
  for(i=1;i<=n;i++) v[i]=NULL;
  for(i=0;i<e;i++) {
    scanf("%d %d",&a,&b);
    add(v[a],b);
  }
}

int pairup(int n) {
  lista *q;
  if(u[n]) return 0;
  u[n]=1;
  for(q=v[n];q;q=q->next)
   if(!r[q->x]) {
     l[n]=q->x;
     r[q->x]=n;
     return 1;
   }
  for(q=v[n];q;q=q->next)
   if(pairup(r[q->x])) {
     l[n]=q->x;
     r[q->x]=n;
     return 1;
   }
   return 0;
}

void scrie() {
  freopen("cuplaj.out","w",stdout);
  printf("%d\n",nc);
  for(int i=1;i<=n;i++)
   if(l[i]) printf("%d %d\n",i,l[i]);
}

int main() {
  int i;
  citeste();
  for(int change=1;change;) {
    change=0;
    for(i=1;i<=n;i++) u[i]=0;
    for(i=1;i<=n;i++)
     if(!l[i])
      if(pairup(i)) change=1;
  }
  for(i=1;i<=n;i++)
   if(l[i]>0) nc++;
  scrie();
  return 0;
}