Pagini recente » Cod sursa (job #1166292) | Cod sursa (job #1345256) | Cod sursa (job #2278317) | Cod sursa (job #2315298) | Cod sursa (job #2358889)
#include <fstream>
#include <cstdio>
#include <vector>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
const int N_MAX = 10000;
vector<int> Edges[N_MAX + 1];
int N, M, E;
int l[N_MAX + 1]; //reprezinta nodul pereche pt un nod din multimea stanga in cuplaj
int r[N_MAX + 1]; //reprezinta nodul pereche pt un nod din multimea dreapta in cuplaj
bool viz[N_MAX + 1]; //vectorul viz (pentru multimea stanga)
int Cuplaj(int x) { //returneaza 1 daca s-a cuplat nodul x (din multimea stanga)
if(viz[x])
return 0;
viz[x] = true;
for(auto y : Edges[x])
if(!r[y]) { //daca nici y nu are muchie incidenta in cuplaj, il cuplam pe x cu y
l[x] = y;
r[y] = x;
return 1;
}
//daca nu am returnat 1, inseamna ca fiecare vecin y este deja cuplat, dar poate putem cupla un vecin y cu altul si sa il cuplam dupa pe x cu y
for(auto y : Edges[x])
if(Cuplaj(r[y])) {
l[x] = y;
r[y] = x;
return 1;
}
return 0;
}
int main() {
int x, y;
in >> N >> M >> E;
for(int i = 1; i <= E; ++i) {
in >> x >> y;
Edges[x].push_back(y);
}
int cuplaj = 0;
for(int i = 1; i <= N; ++i)
if(!l[i]) //daca i nu e cuplat, cautam sa-l cuplam
if(!Cuplaj(i)) { //daca nu am reusit sa-l cuplam
for(int j = 1; j <= N || j <= M; ++j) //resetam vectorul viz
viz[j] = false;
cuplaj += Cuplaj(i); //incercam sa refacem cuplarea
} else //daca am reusit sa-l cuplam
++cuplaj;
out << cuplaj << '\n';
for(int i = 1; i <= N; ++i)
if(l[i])
out << i << ' ' << l[i] << '\n';
return 0;
}