Pagini recente » Cod sursa (job #2209536) | Cod sursa (job #2243856) | Cod sursa (job #1305843) | Cod sursa (job #3342031)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
const int maxn = 10005;
vector <int> nod[maxn];
int a, b, m, x, y, ans;
int l[maxn], r[maxn];
bool viz[maxn];
bool check(int x) { // x este nod din stanga
if(viz[x] == true) {
return false;
}
viz[x] = true;
for(auto u : nod[x]) { // u este din partea dreapta, vecin al lui x
if(l[u] == false) { // daca u nu este cuplat cu niciun nod
l[u] = x;
r[x] = u;
return true; // true -> am reusit sa mai fac inca o cuplare
}
}
for(auto u : nod[x]) {
if(check(l[u]) == true) { // l[u] - nodul cu care e deja cuplat nodul u
r[x] = u;
l[u] = x;
return true;
}
}
return false; // false -> nu am reusit sa cuplez nodul x cu niciun nod din dreapta
}
int main()
{
int i;
f >> a >> b >> m;
for(i = 1; i <= m; i ++) {
f >> x >> y;
nod[x].push_back(y);
}
// r[i] = care este nodul din dreapta cu care e cuplat nodul i (nodul i fiind din stanga)
// l[i] = care este nodul din stanga cu care e cuplat nodul i (nodul i fiind din dreapta)
bool ok;
// do {
// ok = false;
for(i = 1; i <= a; i ++) {
memset(viz, false, sizeof(viz));
if(r[i] == false && check(i) == true) {
ans ++;
ok = true;
}
}
// } while(ok == true);
g << ans << '\n';
for(i = 1; i <= a; i ++) {
if(r[i] != 0) {
g << i << ' ' << r[i] << '\n';
}
}
f.close();
g.close();
return 0;
}
/*
Stanga: A, B, C, D
Dreapta: 1, 2, 3, 4
A-1, 2, 3, 4
B-1, 2, 3
C-1, 2, 3
D-4
Stanga: a1-a5
Dreapta: p1-p5
a1 a2 a3 a4 a5
p1 x x
p2 x x x x
p3 x x x x
p4 x
p5 x x x
Nu e corect daca se cupleaza a5 cu p5. (trebuie cuplat a5 cu p4)
o - x - -
x o - - -
- x x x o
- - x o x
x x - - -
x - o - -
o x - - -
- x x o x
- - x x o
x o - - -
1 2
A x o
B o
*/