Pagini recente » Cod sursa (job #1048764) | Cod sursa (job #984893) | Cod sursa (job #2182079) | Cod sursa (job #2440419) | Cod sursa (job #1625246)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
#define DIM 20005
vector <vector <int> > Graph;
vector <int> cuplat;
int N, M, K, x, y, viz[DIM], deviz;
int DFS(int i);
void cupleaza(int a, int b);
int main() {
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d %d %d\n", &N, &M, &K);
Graph.resize(N + M + 1);
cuplat.resize(N + M + 1);
for(int i = 1; i <= K; ++i) {
scanf("%d %d\n", &x, &y);
Graph[x].push_back(y + N);
Graph[y + N].push_back(x);
}
int rez = 1;
deviz = 0;
while(rez) {
rez = 0;
++deviz;
for(int i = 1; i <= N + M; ++i) {
if(cuplat[i] == 0 && viz[i] < deviz) {
rez |= DFS(i);
}
}
}
int answer = 0;
for(int i = 1; i <= N; ++i) {
answer += (cuplat[i] != 0);
}
cout << answer << '\n';
for(int i = 1; i <= N; ++i) {
if(cuplat[i] != 0) {
cout << i << ' ' << cuplat[i] - N << '\n';
}
}
return 0;
}
int DFS(int i) {
viz[i] = deviz;
for(auto j: Graph[i]) {
if(viz[j] < deviz) {
viz[j] = deviz;
if(cuplat[j]) {
if(DFS(cuplat[j])) {
cupleaza(i, j);
return 1;
}
}
else {
cupleaza(i, j);
return 1;
}
}
}
return 0;
}
void cupleaza(int a, int b) {
cuplat[cuplat[a]] = 0;
cuplat[a] = b;
cuplat[cuplat[b]] = 0;
cuplat[b] = a;
}