Pagini recente » Cod sursa (job #2139182) | Cod sursa (job #174277) | Cod sursa (job #1822920) | Cod sursa (job #2071813) | Cod sursa (job #2654438)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
vector<vector<int>> neighbors;
bool used[10003];
int parent[10003], son[10003];
bool pairup(int current_node) {
if (used[current_node])
return 0;
used[current_node] = true;
for(int i = 0; i< neighbors[current_node].size() ; ++i)
if (!parent[neighbors[current_node][i]]) {
parent[neighbors[current_node][i]] = current_node;
son[current_node] = neighbors[current_node][i];
return true;
}
for(int i = 0; i< neighbors[current_node].size(); ++i)
if (pairup(neighbors[current_node][i])) {
parent[neighbors[current_node][i]] = current_node;
son[current_node] = neighbors[current_node][i];
return true;
}
return false;
}
int main() {
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
int n, m, e, a, b;
scanf("%d%d%d", &n, &m, &e);
neighbors.resize(n+1);
for(int i=0; i<e; ++i) {
scanf("%d%d", &a, &b);
neighbors[a].push_back(b);
}
int change = 1;
while(change) {
change = 0;
memset(used, 0, sizeof(used));
for(int i=1; i<=n; ++i)
if (! son[i])
change += pairup(i);
}
int res = 0;
for(int i=1; i<=n; ++i)
if (son[i])
++res;
printf("%d\n", res);
for(int i=1; i<=n; ++i)
if (son[i])
printf("%d %d\n", i, son[i]);
return 0;
}