Cod sursa(job #1439520)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 22 mai 2015 15:23:12
Problema Cuplaj maxim in graf bipartit Scor 36
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<fstream>
#include<cstring>
using namespace std;
typedef struct celula {
	    int nod;
		celula *next;
}*lista;
lista graf[10005],v;
int i,n,m,e,l[10005],r[10005];
bool viz[10005];

bool cupleaza(int nod) {

	if (viz[nod]) return 0;

	viz[nod]=1;

	for (lista p=graf[nod]; p; p=p->next)
		if (r[p->nod]==0) {

			r[p->nod]=nod;
			l[nod]=p->nod;
			return 1;

		}

	for (lista p=graf[nod]; p; p=p->next)
		if (cupleaza(r[p->nod])) {
			r[p->nod]=nod;
			l[nod]=p->nod;
			return 1;
		}

	return 0;

}

int main(void) {

	ifstream cin("cuplaj.in");
	ofstream cout("cuplaj.out");

	bool ok=1;
	cin>>n>>m>>e;

	for (i=1; i<=e; ++i) {
		int x, y;
		cin>>x>>y;
		v=new celula; v->nod=x; v->next=graf[y]; graf[y]=v;
	}

	while (ok) {
		ok=0;
		memset(viz,0,sizeof(viz));
		for (i=1; i<=n; ++i)
			 if (l[i]==0&&cupleaza(i)) ok=1;
	}

	int cmax=0;
	for (i=1; i<=n; ++i) if (l[i]) ++cmax;

	cout<<cmax<<"\n";

	for (i=1; i<=n; ++i) if (l[i]) cout<<i<<" "<<l[i]<<"\n";


	return 0;
}