Cod sursa(job #1744102)

Utilizator dodecagondode cagon dodecagon Data 19 august 2016 12:14:32
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 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,st[10009],dr[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 (! dr[p->x])
		{
          dr[p->x]=v;
          st[v]=p->x;
          return 1;
		}
	for (list * p = g[v]; p ; p=p->next)
     if (dfs(dr[p->x]))
		{
          dr[p->x]=v;
          st[v]=p->x;
          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);
	}
 ok=1;
 while (ok)
 { 
 	ok=0;
    memset(u,0,sizeof(u));
   for (i=1;i<=n;++i)
   	 	 if (st[i]==0 && dfs(i))
   	 	 	ok=1;
 }
   	 
   
   for (i=1;i<=m;++i)
     if (dr[i])
     	k++;
     printf("%d\n",k);
     for (i=1;i<=m;++i)
     	if (dr[i])
     		printf("%d %d\n",dr[i],i);

	fclose(in);
	fclose(out);

	return 0;
}