Cod sursa(job #1727404)

Utilizator theo.stoicanTheodor Stoican theo.stoican Data 10 iulie 2016 18:28:27
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <climits>
#include <queue>

using namespace std;

ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");

vector<vector<int> > L;
int n,m,e;
vector<int> dist;
vector<int> pair_U;
vector<int> pair_V;
int result=0;
bool BFS()
{
	queue<int> q;
	for (int i = 1; i <= n; i++)
	{
		if (pair_U[i] == 0)
		{
			dist[i] = 0;
			q.push(i);
		}
		else
		{
			dist[i] = INT_MAX;
		}
	}
	dist[0] = INT_MAX;

	while (!q.empty())
	{
		int node = q.front();
		q.pop();
		if (dist[node] < dist[0])
		{
			for (int i = 0; i<L[node].size();i++)
			{
				if (dist[pair_V[L[node][i]]] == INT_MAX)
				{
					dist[pair_V[L[node][i]]] = dist[node] + 1;
					q.push(pair_V[L[node][i]]);
				}
			}
		}
	}
	return dist[0] != INT_MAX;
}

bool dfs (int x)
{
	if (x != 0)
	{
		for (int i = 0; i < L[x].size(); i++)
		{
			if (dist[pair_V[L[x][i]]] == dist[x] + 1)
			{
				if (dfs(pair_V[L[x][i]]) == true)
				{
					pair_V[L[x][i]] = x;
					pair_U[x] = L[x][i];
					return true;
				}
			}
		}
		//dist[x] = INT_MAX;
		return false;	
	}
	return true;
}

int main ()
{
	fin>>n>>m>>e;
	L.resize(n+1);
	dist.resize(n+1);
	pair_U.resize(n+1,0);
	pair_V.resize(m+1,0);
	for (int i = 1; i <= e; i++)
	{
		int u,v;
		fin>>u>>v;
		L[u].push_back(v);
	}
	while (BFS())
	{
		for (int i = 1; i <= n; i++)
		{
			if (pair_U[i] == 0 && dfs(i))
			{
				result++;
			}
		}
	}
	fout<<result<<"\n";
	for (int i = 1; i <= n; i++)
	{
		if (pair_U[i] != 0)
		{
			fout<<i<<" "<<pair_U[i]<<"\n";
		}
	}
}