Pagini recente » Istoria paginii runda/preoji2014_1/clasament | Istoria paginii runda/necartofeala_1/clasament | Istoria paginii runda/necartofeala_1/clasament | Cod sursa (job #3001473) | Cod sursa (job #2659427)
#include <fstream>
#include <vector>
#include <cstring>
#define NMAX 10005
#define EMAX 100005
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int N, M, E;
vector<vector<int>> gr;
int lef[NMAX], righ[NMAX];
bool d[EMAX];
void read() {
int x, y;
fin >> N >> M >> E;
gr.resize(N + 1);
for (int i = 0; i < E; ++i) {
fin >> x >> y;
gr[x].push_back(y);
}
}
int cupleaza(int a, int b) {
lef[a] = b;
righ[b] = a;
}
bool link(int node) {
if (d[node] == true) {
return false;
}
d[node] = true;
for (int i : gr[node]) {
if (righ[i] == 0) {
cupleaza(node, i);
return true;
}
}
for (int i : gr[node]) {
if (link(righ[i])) {
cupleaza(node, i);
return true;
}
}
return false;
}
int main()
{
read();
bool ok = true;
while (ok) {
ok = false;
memset(d, false, sizeof d);
for (int i = 1; i <= N; ++i) {
if (!lef[i])
ok = ok | link(i);
}
}
int con = 0;
for (int i = 1; i <= N; ++i) {
if (lef[i] != 0) {
++con;
}
}
fout << con << "\n";
for (int i = 1; i <= N; ++i) {
if (lef[i] != 0) {
fout << i << " " << lef[i] << "\n";
}
}
return 0;
}