Mai intai trebuie sa te autentifici.
Cod sursa(job #565525)
Utilizator | Data | 27 martie 2011 21:12:23 | |
---|---|---|---|
Problema | Cuplaj maxim in graf bipartit | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.28 kb |
#include <fstream>
#include <vector>
using namespace std;
ifstream in ("cuplaj.in");
ofstream out ("cuplaj.out");
const int N = 10005;
int n, m, per, left_pair[N], right_pair[N];
vector<int> L[N];
bool f[N];
void read() {
int e, x, y;
in >> n >> m >> e;
for (int i = 1; i <= e; ++ i) {
in >> x >> y;
L[x].push_back(y);
}
}
void reset(bool f[N]) {
for (int i = 1; i <= n; ++ i)
f[i] = 0;
}
bool cupleaza(int nod) {
if (f[nod])
return 0;
f[nod] = 1;
for (vector <int> :: iterator it = L[nod].begin(); it != L[nod].end(); ++ it)
if (! right_pair[*it]) {
left_pair[nod] = *it;
right_pair[*it] = nod;
return 1;
}
for (vector <int> :: iterator it = L[nod].begin(); it != L[nod].end(); ++ it)
if (right_pair[*it] && cupleaza(right_pair[*it])) {
left_pair[nod] = *it;
right_pair[*it] = nod;
return 1;
}
return 0;
}
void solve() {
bool ok = true;
while(ok) {
ok = false;
reset(f);
for (int i = 1; i <= n; ++ i)
if (!left_pair[i] && cupleaza(i)) {
ok = true;
++ per;
}
}
}
void afis() {
out << per << '\n';
for (int i = 1; i <=n ; ++ i)
if (left_pair[i])
out << i << ' ' << left_pair[i] << '\n';
}
int main() {
read();
solve();
afis();
return 0;
}