Pagini recente » Cod sursa (job #2726317) | Cod sursa (job #2847047) | Cod sursa (job #2904497) | Cod sursa (job #2281072) | Cod sursa (job #2666066)
#include <fstream>
#include <bitset>
#include <vector>
#define K 10004
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n,m,k,i,x,y,ok,st[K],dr[K],sol;
//st[i]=nodul din dr cu care e cuplat i din st
//dr[i]=nodul din st cu care e cuplat i din dr
bitset <K> viz;
vector <int> v[K];
int cupleaza(int nod){
if(viz[nod])
return 0; //daca am fost deja aici nu ma mai interseaza
viz[nod]=1;
for(auto vecin:v[nod])
if(dr[vecin]==0){
st[nod]=vecin; //incerc sa cuplez nod cu vecini directi
dr[vecin]=nod;
sol++;
return 1;
}
//daca nu gasesc, caut un vecin cuplat din dreapta al carui vecin din stg poate fi cuplat altfel
for(auto vecin: v[nod])
if(cupleaza(dr[vecin])){
st[nod]=vecin;
dr[vecin]=nod;
return 1;
}
return 0;
}
int main(){
fin>>n>>m>>k;
for(i=1;i<=k;i++){
fin>>x>>y;
v[x].push_back(y); //vecinii din dr ai celor din stg
}
ok=1;
while(ok){
ok=0;
viz.reset();
for(i=1;i<=n;i++)
if(st[i]==0 && cupleaza(i))
ok=1;
}
fout<<sol<<"\n";
for(i=1;i<=n;i++)
if(st[i])
fout<<i<<" "<<st[i]<<"\n";
return 0;
}