Pagini recente » Cod sursa (job #1955104) | Cod sursa (job #1221220) | Borderou de evaluare (job #1287029) | Cod sursa (job #910391) | Cod sursa (job #2252187)
#include <bits/stdc++.h>
using namespace std;
int vizitateStanga[10001], vizitateDreapta[10001], viz[10001], nr;
vector < int > graff[10001];
int n, m ,e, x, y, k;
void visit(){
for (int i = 1; i<= n; i++){
viz[i] = 0;
}
}
bool cuplare(int nod){
if(viz[nod] == 1){
return 0;
}
viz[nod] = 1;
for (auto p : graff[nod]){
if(vizitateDreapta[p] == 0){
vizitateStanga[nod] = p;
vizitateDreapta[p] = nod;
return 1;
}
}
for (auto p : graff[nod]){
if(cuplare(vizitateDreapta[p])){
vizitateStanga[nod] = p;
vizitateDreapta[p] = nod;
return 1;
}
}
return 0;
}
int main() {
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
f >> n >> m >> e;
for (int i = 1; i <= e; i++){
f >> x >> y;
vizitateStanga[x] = 0;
vizitateDreapta[y] = 0;
graff[x].push_back(y);
}
for (int k = 1; k;){
k = 0;
visit();
for (int i = 1; i <= n; i++){
if(vizitateStanga[i] == 0){
k |= cuplare(i);
}
}
}
for (int i = 1; i<= n; i++){
if(vizitateStanga[i]){
nr++;
}
}
g << nr << "\n";
for (int i = 1; i <= n ; i++){
if(vizitateStanga[i]){
g << i << " " << vizitateStanga[i] << "\n";
}
}
return 0;
}