Pagini recente » Cod sursa (job #1619133) | Cod sursa (job #2962951) | Cod sursa (job #160277) | Cod sursa (job #919885) | Cod sursa (job #2882801)
#include <bits/stdc++.h>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
const int N = 1e4 + 1, M = 1e4 + 1;
int n, m, e, x, y, pereche[N], pereche2[M];
vector<int> c[N];
bool viz[N];
int incearca(int x){
if(viz[x])
return 0;
viz[x] = 1;
for(int y: c[x]){
if(pereche2[y] == 0 || incearca(pereche2[y])){ // y nu e cuplat sau perechea lui y poate fi cuplata altfel
pereche[x] = y;
pereche2[y] = x;
return y;
}
}
return 0;
}
int main(){
f >> n >> m >> e;
for(int i = 0; i < e; i++){
f >> x >> y;
c[x].push_back(y); // felul in care lucram ne lasa sa ignoram si muchia de la y la x
}
f.close();
bool imbunatatire;
do{
imbunatatire = 0;
memset(viz, 0, sizeof(viz));
for(int i = 1; i <= n; i++){
if(pereche[i] == 0){ // i nu este cuplat cu un element/varf din dreapta
incearca(i);
if(pereche[i])
imbunatatire = 1; // cuplajul s-a marit
}
}
}while(imbunatatire);
int cuplaj = 0;
for(int i = 1; i <= n; i++){
if(pereche[i])
cuplaj++;
}
g << cuplaj << '\n';
for(int i = 1; i <= n; i++){
if(pereche[i])
g << i << ' ' << pereche[i] << '\n';
}
g.close();
}