Pagini recente » Cod sursa (job #1853034) | Cod sursa (job #11455) | Cod sursa (job #748947) | Cod sursa (job #2832201) | Cod sursa (job #2556393)
#include <bits/stdc++.h>
#define NM_MAX 10000 + 1
using namespace std;
vector<vector<int>> graph(NM_MAX, vector<int>());
int N, M, E;
int LEFT[NM_MAX], RIGHT[NM_MAX];
bool VISITED[NM_MAX];
bool pair_up(int left_node)
{
if(VISITED[left_node] == true) return false;
VISITED[left_node] = true;
for(auto& right_node : graph[left_node])
{
if(LEFT[right_node] == 0)
{
LEFT[right_node] = left_node;
RIGHT[left_node] = right_node;
return true;
}
}
for(auto& right_node : graph[left_node])
{
if(pair_up(LEFT[right_node]) == true)
{
LEFT[right_node] = left_node;
RIGHT[left_node] = right_node;
return true;
}
}
return false;
}
int main()
{
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
fin >> N >> M >> E;
for(int i = 1; i <= E; ++i)
{
int left_node, right_node;
fin >> left_node >> right_node;
graph[left_node].push_back(right_node);
}
int cardinal = 0;
bool no_changes = false;
while(no_changes == false)
{
no_changes = true;
fill(VISITED + 1, VISITED + N + 1, false);
for(int i = 1; i <= N; ++i)
{
if(RIGHT[i] == 0 && pair_up(i) == true)
{
++cardinal;
no_changes = false;
}
}
}
fout << cardinal << '\n';
for(int i = 1; i <= N; ++i)
{
if(RIGHT[i] != 0)
{
fout << i << ' ' << RIGHT[i] << '\n';
}
}
}