Pagini recente » Cod sursa (job #566634) | Cod sursa (job #2455918) | Cod sursa (job #1662270) | Cod sursa (job #751927) | Cod sursa (job #2556614)
#include <bits/stdc++.h>
using namespace std;
const int NM_MAX = 1e4 + 1;
int LEFT[NM_MAX], RIGHT[NM_MAX];
bool VISITED[NM_MAX];
vector<vector<int>> GRAPH(NM_MAX, vector<int>());
int N, M, E;
bool pair_up(int l_node)
{
if(VISITED[l_node] == true) return false;
VISITED[l_node] = true;
for(auto& r_node : GRAPH[l_node])
{
if(LEFT[r_node] == 0)
{
LEFT[r_node] = l_node;
RIGHT[l_node] = r_node;
return true;
}
}
for(auto& r_node : GRAPH[l_node])
{
if(pair_up(LEFT[r_node]) == true)
{
LEFT[r_node] = l_node;
RIGHT[l_node] = r_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 l_node, r_node;
fin >> l_node >> r_node;
GRAPH[l_node].push_back(r_node);
}
int coupling_cardinal = 0;
bool no_changes = false;
while(no_changes == false)
{
for(int i = 1; i <= N; ++i)
VISITED[i] = false;
no_changes = true;
for(int i = 1; i <= N; ++i)
{
if(RIGHT[i] == 0 && pair_up(i))
{
no_changes = false;
coupling_cardinal++;
}
}
}
fout << coupling_cardinal << '\n';
for(int i = 1; i <= N; ++i)
{
if(RIGHT[i] != 0 )
{
fout << i << ' ' << RIGHT[i] << '\n';
}
}
}