Pagini recente » Cod sursa (job #1484916) | Cod sursa (job #1867790) | Cod sursa (job #1238273) | Cod sursa (job #122019) | Cod sursa (job #2694400)
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
#define NMAX 10005
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n, m, e;
vector<int>graph[NMAX];
int vs[NMAX],vd[NMAX];
bitset<NMAX>viz;
int nrm=0;
void citire(){
f>>n>>m>>e;
int x, y;
for(int i=1; i<=e; i++){
f>>x>>y;
graph[x].push_back(y);
}
}
bool solve(int nod){
if(viz[nod]) // daca ar fi deja unit
return false;
viz[nod] = 1;
for(auto &v:graph[nod]){
if(vs[v]==0){ // nu e legat de nimeni din st
vd[nod] = v;
vs[v] = nod;
return true;
}
}
for(auto &v:graph[nod])
if(solve(vs[v])){ // daca il pot lega pe vecinul celui pe care vreau sa il unesc acum
vd[nod] = v;
vs[v] = nod;
return true;
}
return false;
}
void afisare(int nr){
g<<nr<<'\n';
for(int i=1; i<=n; i++)
if(vd[i] != 0)
g<<i<<" "<<vd[i]<<'\n';
}
int main()
{
citire();
int nr=0;
bool ok = true;
while(ok){
ok = false;
viz.reset();
for(int i=1; i<=n; i++)
if(vd[i] == 0){ // nu e inca unit
bool aj = solve(i);
ok=(ok|aj);
nr+=aj;
}
}
afisare(nr);
return 0;
}