Cod sursa(job #2409099)

Utilizator aturcsaTurcsa Alexandru aturcsa Data 18 aprilie 2019 17:47:19
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <cstdio>
#include <cstring>
#define DN 10005

struct nod {
	int x;
	nod *urm;
}*v[DN];

int n,m,e,
	l[DN],//nodurile din dreapta care sunt cuplate cu nodurile din stanga
	r[DN],//nodurile din stanga care sunt cuplate cu nodurile din dreapta
	u[DN];

void adaugare(int x,int y) {
	nod *p;
	p=new nod;
	p->x=y;
	p->urm=v[x];
	v[x]=p;
}

bool cupleaza(int sursa) {
	nod *p;
	if(u[sursa]) return false;
	u[sursa]=1;
	for(p=v[sursa]; p!=NULL; p=p->urm)
		if(!r[p->x]){
			l[sursa]=p->x;
			r[p->x]=sursa;
			return true;
		}
	for(p=v[sursa]; p!=NULL; p=p->urm)
		if(cupleaza(r[p->x])) {
			l[sursa]=p->x;
			r[p->x]=sursa;
			return true;
		}
	return false;
}

int main()
{
	int i,x,y,cont=0;
	bool ok=true;
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	scanf("%d %d %d",&n,&m,&e);
	for(i=1; i<=e; i++) {
		scanf("%d %d",&x,&y);
		adaugare(x,y);
	}
	while (ok) {
		ok=false;
		memset(u,0,sizeof(u));
		for(i=1; i<=n; i++)
			if(!l[i])//nodul i nu a fost cuplat
				ok=ok|cupleaza(i);
	}
	for(i=1; i<=n; i++) if(l[i]) ++cont;
	printf("%d\n",cont);
	for(i=1;i<=n;i++) if (l[i] > 0)
		printf("%d %d\n", i, l[i]);
	return 0;
}