Pagini recente » Cod sursa (job #908501) | Cod sursa (job #615881) | Cod sursa (job #401489) | Cod sursa (job #2041213) | Cod sursa (job #696285)
Cod sursa(job #696285)
#include <cstdio>
#include <vector>
#define NMAX 10011
using namespace std;
vector <int> G[NMAX];
int N,M,used[NMAX],left[NMAX],right[NMAX];
void Read(){
int Edges,x,y;
freopen("cuplaj.in","r",stdin);
scanf("%d%d%d",&N,&M,&Edges);
for(;Edges>0;Edges--){
scanf("%d%d",&x,&y);
G[x].push_back(y);
}
}
bool Pair(int nod){
if(used[nod]) return 0;
used[nod]=1;
vector <int>::iterator it;
for(it=G[nod].begin();it!=G[nod].end();it++)
if(!right[*it]){
left[nod]=*it;
right[*it]=nod;
return 1;
}
for(it=G[nod].begin();it!=G[nod].end();it++)
if(Pair(right[*it])){
left[nod]=*it;
right[*it]=nod;
return 1;
}
return 0;
}
void Solve(){
int i,ok;
ok=1;
for(;ok;){
ok=0;
memset(used,0,sizeof(used));
for(i=1;i<=N;i++)
if(!left[i]) ok|=Pair(i);
}
}
void Write(){
int cuplaj=0,i;
freopen("cuplaj.out","w",stdout);
for(i=1;i<=N;i++) cuplaj+=(left[i]>0);
printf("%d\n",cuplaj);
for(i=1;i<=N;i++)
if(left[i]) printf("%d %d\n",i,left[i]);
}
int main(){
Read();
Solve();
Write();
return 0;
}