Cod sursa(job #906017)

Utilizator raulstoinStoin Raul raulstoin Data 6 martie 2013 13:32:19
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<cstdio>
#include<vector>
#include<cstring>
#define NMAX 10005
#define vec G[nod][i]
#define CUPLARE { l[nod]=vec; r[vec]=nod; return 1; }
using namespace std;
FILE *fin,*fout;
vector<int> G[NMAX];
bool use[NMAX];
int n,m,l[NMAX],r[NMAX];
void read()
{
	fin=fopen("cuplaj.in","r");
	int edges,x,y;
	fscanf(fin,"%d %d %d",&n,&m,&edges);
	while(edges--)
	{
		fscanf(fin,"%d %d",&x,&y);
		G[x].push_back(y);
	}
	fclose(fin);
}
void print()
{
	fout=fopen("cuplaj.out","w");
	int s=0;
	for(int i=1;i<=n;i++)
		if(l[i])
			s++;
	fprintf(fout,"%d\n",s);
	for(int i=1;i<=n;i++)
		if(l[i])
			fprintf(fout,"%d %d\n",i,l[i]);
	fclose(fout);
}
bool pairup(int nod)
{
	if(use[nod])
		return 0;
	use[nod]=1;
	for(size_t i=0;i<G[nod].size();i++)
		if(!r[vec])
			CUPLARE
	for(size_t i=0;i<G[nod].size();i++)
		if(pairup(r[vec]))
			CUPLARE
	return 0;
}
int main()
{
	read();
	bool sw=1;
	while(sw)
	{
		sw=0;
		memset(use,0,sizeof(use));
		for(int i=1;i<=n;i++)
			if(!l[i])
				sw|=pairup(i);
	}
	print();
	return 0;
}