Cod sursa(job #1744061)

Utilizator dodecagondode cagon dodecagon Data 19 august 2016 11:30:15
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct list 
{
	int x;
	list * next;
} list;

list * g[10009],* p;
int n,m,e,i,j,k,mt[10009];
char u[10009];
int ok;

int next_int()
{
   char c=getchar();
   while (c>57 || c < 48) c=getchar();
   int k=0; 
   while (c<=57 && c>=48) 
   {
      k=k*10+c-48;
      c=getchar();
   }

   return k;
}

 void add(list ** l,int v)
{
	p=(list *) malloc(sizeof(list));
	p->next=*l;
	p->x=v;
	*l=p;
}

int dfs(int v)
{ 
	if (u[v]) return 0;
	u[v]=1;
	for (list * p = g[v]; p ; p=p->next)
     if (! mt[p->x] || dfs(mt[p->x]))
		{
          mt[p->x]=v;
          return 1;
		}

  return 0;

}

int main()
{
	FILE * in,*out;
	in=freopen("cuplaj.in","r",stdin);
	out=freopen("cuplaj.out","w",stdout);

	n=next_int();
	m=next_int();
	e=next_int();

	while (e--)
	{
		i=next_int();
		j=next_int();
		add(&g[i],j);
	}

   for (i=1;i<=n;++i)
   	 {
   	 	memset(u,0,sizeof(u));
        ok=dfs(i);
   	 }
   
   for (i=1;i<=m;++i)
     if (mt[i])
     	k++;
     printf("%d\n",k);
     for (i=1;i<=m;++i)
     	if (mt[i])
     		printf("%d %d\n",mt[i],i);

	fclose(in);
	fclose(out);

	return 0;
}