Cod sursa(job #1744051)

Utilizator dodecagondode cagon dodecagon Data 19 august 2016 11:18:36
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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

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

inline 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;
}

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

bool dfs(int v)
{ 
	if (u[v]) return false;
	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 true;
		}

  return false;

}

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;
}