Cod sursa(job #3349577)

Utilizator Botnaru_VictorBotnaru Victor Botnaru_Victor Data 31 martie 2026 19:34:55
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>
using namespace std;
//#define TESTS

#define x first
#define y second
#define pii pair<int,int>
#define veci vector<int>
#define vecp vector<pii>
#define all(x) x.begin(), x.end()
#define pb(x,y) x.push_back(y)

const int maxn = 1e5+5;

int n1,n2,m;

//st[i] = nodul din dreapta la care este cuplat i
//dr[i] = nodul din stanga la care este cuplat i
//adj[i] = lista de adiacenta a nodului i din stanga
vector<int> adj[maxn];
int st[maxn], dr[maxn];
int vis[maxn];

//daca am gasit un drum alternant incepand din x
int drum(int x)
{
	//cerr<<"Here "<<x<<'\n';
	vis[x]=1;
	for(auto e:adj[x])
	{
		if(dr[e]==0)
		{
			st[x]=e;
			dr[e]=x;
			return 1;
		}
	}

	for(auto e:adj[x])
	{
		if(!vis[dr[e]])
		{
			if(drum(dr[e]))
			{
				st[x]=e;
				dr[e]=x;
				return 1;
			}
		}
	}
	return 0;
}

int cuplaj()
{
	int c = 0;
	int oldC = -1;	
	while(c != oldC)
	{
		oldC = c;

		for(int i=1;i<=n1;i++) vis[i]=0;

		for(int i=1;i<=n1;i++)
		{
			if(st[i]==0 && vis[i]==0)
			{
				c += drum(i);
			}
		}
	}
	return c;
}


void solve()
{
	cin>>n1>>n2>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		adj[x].push_back(y);
	}

	cout<<cuplaj()<<'\n';

	for(int i=1;i<=n1;i++)
	{
		if(st[i]!=0)
		{
			cout<<i<<' '<<st[i]<<'\n';
		}
	}
}

int main()
{
	#ifndef LOCAL
		#define fname "cuplaj"
		freopen(fname".in","r", stdin);
		freopen(fname".out","w",stdout);
	#endif

	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);

	int t=1;

	#ifdef TESTS
		cin>>t;
	#endif
	while(t--)
	{
		solve();
	}
	return 0;
}