Pagini recente » Cod sursa (job #3036686) | Cod sursa (job #2778310) | Cod sursa (job #2673319) | Cod sursa (job #1953246) | Cod sursa (job #301907)
Cod sursa(job #301907)
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
#define pb push_back
#define tr(C, i) for (typeof((C).begin()) i = (C).begin(); i != (C).end(); ++i)
typedef vector<int> VI;
typedef vector<VI> VVI;
int N, M;
VVI G;
VI U, l, r;
bool pairup(int u) {
if (U[u])
return false;
U[u] = true;
tr(G[u], vv)
if (!r[*vv]) {
l[u] = *vv;
r[*vv] = u;
return true;
}
tr(G[u], vv)
if (pairup(r[*vv])) {
l[u] = *vv;
r[*vv] = u;
return true;
}
return false;
}
int main(int argc, char *argv[]) {
int E, u, v;
ifstream fin("cuplaj.in");
fin >> N >> M >> E;
G.resize(N+1);
while (E--) {
fin >> u >> v;
G[u].pb(v);
}
fin.close();
U.resize(N+1);
l.resize(N+1);
r.resize(N+1);
for (bool changed = true; changed; ) {
changed = false;
fill(U.begin(), U.end(), false);
for (int i = 1; i <= N; ++i)
if (!l[i])
changed |= pairup(i);
}
int m = 0;
for (int i = 1; i <= N; ++i)
if (l[i])
++m;
ofstream fout("cuplaj.out");
fout << m << endl;
for (int i = 1; i <= N; ++i)
if (l[i])
fout << i << " " << l[i] << endl;
fout.close();
return 0;
}