Cod sursa(job #1521745)

Utilizator afkidStancioiu Nicu Razvan afkid Data 10 noiembrie 2015 20:00:47
Problema Cuplaj maxim in graf bipartit Scor 4
Compilator cpp Status done
Runda Arhiva educationala Marime 1 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]]==-1)
		{
			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[u][v];
			r[g[v][u]]=v;
			return true;
		}
	}
	return false;
}

int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	freopen("cuplaj.in","r",stdin);
	freopen("cuplaj.out","w",stdout);
	cin>>n>>m>>e;
	for(int i=0;i<e;++i)
	{
		cin>>a>>b;
		g[a].push_back(b);
	}	
	for(int i=1;i<=n;++i)
		l[i]=-1;
	for(int i=1;i<=m;++i)
		r[i]=-1;
	int cnt=0;
	fill(vis,vis+n+1,false);
	for(int i=1;i<=n;++i)
	{
		if(!dfs(i))
		{
			fill(vis,vis+n+1,false);
			if(dfs(i))
				cnt++;
		}
		else
			cnt++;
	}
	cout<<cnt<<"\n";
	for(int i=1;i<=n;++i)
	{
		if(l[i]!=-1)
			cout<<i<<" "<<l[i]<<"\n";
	}
	return 0;
}