Cod sursa(job #229451)

Utilizator hadesgamesTache Alexandru hadesgames Data 10 decembrie 2008 12:11:18
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
#include <iostream>
using namespace std;
#define FOR(i,a,b) for (i=a;i<=b;i++)
#define fori(it,v) for (it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fs first
#define ss second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
vector<vector<int> > a(10005);
int b[10005],c[10005],v[10005];
int cuplaj(int x)
{
	if (v[x])
		return 0;
	v[x]=1;
	vector<int>::iterator it;
	fori(it,a[x])
		if (!c[*it])
		{
			c[*it]=x;
			b[x]=*it;
			return 1;
		}
	fori(it,a[x])
		if (cuplaj(c[*it]))
		{
			c[*it]=x;
			b[x]=*it;
			return 1;
		}
	return 0;
}

int main()
{
	FILE *in,*out;
	int nrc=0,n,m,nr,i,x,y,d;
	in=fopen("cuplaj.in","r");
	out=fopen("cuplaj.out","w");
	fscanf(in,"%d%d%d",&n,&m,&nr);
	FOR(i,1,nr)
	{
		fscanf(in,"%d%d",&x,&y);
		a[x].pb(y);
	}
	d=1;
	while (d)
	{
		d=0;
		memset(v,0,sizeof(v));
		FOR(i,1,n)
			if (!b[i])
				d|=cuplaj(i);
	}
	FOR(i,1,n)
		if (b[i])
			nrc++;
	fprintf(out,"%d\n",nrc++);
	FOR(i,1,n)
		if(b[i])
			fprintf(out,"%d %d\n",i,b[i]);
	fclose(in);
	fclose(out);
	return 0;
}