Cod sursa(job #1549373)

Utilizator evillyonLeon Daniel evillyon Data 12 decembrie 2015 11:49:58
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
// ConsoleApplication5.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include<vector>

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

const int N = 20000;
vector<int>v[N];
int l[N];
int na, nb;
int c[N];
int viz[N];

int dfs(int i)
{
	int k, j;
	viz[i] = 1;
	for (j = 0; j<l[i]; j++)
	{
		k = v[i][j];
		if (viz[k] || c[i] == k)continue;
		viz[k] = 1;
		if (c[k] == -1)
		{
			c[k] = i;
			c[i] = k;
			return 1;
		}
		else
		{
			if (dfs(c[k]))
			{
				c[i] = k;
				c[k] = i;
				return 1;
			}
			else continue;
		}
	}
	return 0;
}
void greedy(int i)
{
	for (int j = 0; j<l[i]; j++)
	if (c[j] == -1)
	{
		c[i] = j;
		c[j] = i;
		break;
	}
}
int main()
{
	int ok = 0, i, j, x, y;
	fin >> na >> nb >> j;
	while (j--)
	{
		fin >> x >> y;
		x--;
		y = y + na - 1;
		v[x].push_back(y);
		l[x]++;
		v[y].push_back(x);
		l[y]++;
	}
	for (i = 0; i < na + nb; i++)c[i] = -1;
	while (!ok)
	{
		ok = 1;
		for (i = 0; i < na + nb; i++)viz[i] = 0;
		for (i = 0; i < na; i++)
		if (!viz[i] && c[i] == -1)
		if (dfs(i))
			ok = 0;
	}
	int q = 0;
	for (i = 0; i < na; i++)if (c[i] != -1)q++;
	fout << q << '\n';
	for (i = 0; i < na; i++)
		if (c[i] != -1)
			fout << i + 1 << " " << c[i] - na + 1 << '\n';
	return 0;
}