Cod sursa(job #1549415)

Utilizator cosminionutCosmin Ionut cosminionut Data 12 decembrie 2015 12:17:01
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#include <vector>
using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

int N, M, E;
int L[20000];
vector<int> V[20000];
int na;
int C[20000];
bool viz[20000];

int dfs(int i)
{
	viz[i] = 1;
	for (int j = 1;j<=L[i];++j)
	{
		int k = V[i][j];
		if (viz[k] || C[i] == k)     continue;
		if (C[k] == -1) { viz[k] = 1; C[k] = i; C[i] = k; return 1; }
		else
		{
			viz[k] = 1;
			if (dfs(C[k])) { C[i] = k; C[k] = i; return 1; }
			else continue;
		}
	}
	return 0;
}
void set(int X[], int val)
{
	for (int i = 0;i < 20000;i++)
		X[i] = val;
}
void set(bool X[], int val)
{
	for (int i = 0;i < 20000;i++)
		X[i] = val;
}
int main()
{
	f >> N >> M >> E;
	na = N;
	N = N + M;
	int x, y;
	for (int i = 0;i < E;i++)
	{
		f >> x >> y;
		if (V[x].size() == 0)	V[x].push_back(0);
		if (V[y].size() == 0)	V[y].push_back(0);
		y += na;
		L[x] ++;
		L[y] ++;		
		V[x].push_back(y);
		V[y].push_back(x);
	}
	set(C, -1);//C={-1}
	for (int i = 1;i <= na;i++)
	{
		for (int j = 1;j <= L[i];j++)
			if (C[V[i][j]] == -1)
			{
				C[i] = V[i][j];
				C[V[i][j]] = i;
				break;
			}
	}

	bool ok = 1;
	while (ok)
	{
		ok = 0;
		set(viz, 0);
		for (int i = 1;i <= na;i++)
			if (!viz[i] && C[i] == -1)
				if (dfs(i))
					ok = 1;
	}


	int nr = 0;
	for (int i = 1;i <= na;i++)
		if (C[i]!=-1) nr++;
	g << nr << '\n';
	for (int i = 1;i <= na;i++)
		if (C[i] != -1)
			g << i << " " << C[i]-na << '\n';
		


	return 0;
}