Pagini recente » Cod sursa (job #2887161) | Cod sursa (job #818261) | Cod sursa (job #3201970) | Cod sursa (job #771192) | Cod sursa (job #1051699)
//
// main.cpp
// cuplaj
//
// Created by Robert Badea on 12/10/13.
// Copyright (c) 2013 Robert Badea. All rights reserved.
//
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
vector< vector<int> > graph;
vector<int> left_to_right;
vector<int> right_to_left;
vector<bool> used;
bool pairup(int v)
{
if (used[v])
{
return false;
}
used[v] = true;
for (int i = 0; i < graph[v].size(); ++i)
{
int u = graph[v][i];
if (right_to_left[u] == 0)
{
left_to_right[v] = u;
right_to_left[u] = v;
return true;
}
}
for (int i = 0; i < graph[v].size(); ++i)
{
int u = graph[v][i];
if (pairup(right_to_left[u]))
{
left_to_right[v] = u;
right_to_left[u] = v;
return true;
}
}
return false;
}
int main()
{
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int N, M, E;
fin >> N >> M >> E;
graph.resize(N + 1);
left_to_right.resize(N + 1);
right_to_left.resize(M + 1);
used.resize(N + 1);
for (int i = 0; i < E; ++i)
{
int a, b;
fin >> a >> b;
graph[a].push_back(b);
}
bool there_is_something_to_do = true;
while (there_is_something_to_do)
{
there_is_something_to_do = false;
for (int i = 0; i <= N; ++i)
{
used[i] = false;
}
for (int i = 1; i <= N; ++i)
{
if (left_to_right[i] == 0)
{
there_is_something_to_do = pairup(i) || there_is_something_to_do;
}
}
}
int size = 0;
for (int i = 1; i <= N; ++i)
size += (left_to_right[i] != 0);
fout << size << "\n";
for (int i = 1; i <= N; ++i)
{
if (left_to_right[i] != 0)
{
fout << i << " " << left_to_right[i] << "\n";
}
}
fin.close();
fout.close();
return 0;
}