Cod sursa(job #1521756)

Utilizator afkidStancioiu Nicu Razvan afkid Data 10 noiembrie 2015 20:12:31
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>
#define N 10100

using namespace std;
vector<int> g[N];
int r[N];
int l[N];
bool vis[N];
int n,m,e,a,b;

bool dfs(int v)
{
	if(vis[v]) return false;
	vis[v]=true;
	for(int u=0;u<g[v].size();++u)
	{
		if(!r[g[v][u]])
		{
			l[v]=g[v][u];
			r[g[v][u]]=v;
			return true;
		}
	}
	for(int u=0;u<g[v].size();++u)
	{
		if(dfs(r[g[v][u]]))
		{
			l[v]=g[v][u];
			r[g[v][u]]=v;
			return true;
		}
	}
	return false;
}

int main()
{
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	scanf("%d%d%d",&n,&m,&e);
	for(int i=0;i<e;++i)
	{
		scanf("%d%d",&a,&b);
		g[a].push_back(b);
	}	
	for(int i=1;i<=n;++i)
		l[i]=0;
	for(int i=1;i<=m;++i)
		r[i]=0;
	int cnt=0;
	fill(vis,vis+n+1,false);
	for(int i=1;i<=n;++i)
	{
		if(!l[i])
		{
			if(!dfs(i))
			{
				fill(vis,vis+n+1,false);
				if(dfs(i))
					cnt++;
			}
			else
				cnt++;
		}
	}
	printf("%d\n",cnt);
	for(int i=1;i<=n;++i)
	{
		if(l[i])
			printf("%d %d\n",i,l[i]);
	}
	return 0;
}