Pagini recente » Cod sursa (job #2769012) | Cod sursa (job #1221969) | Cod sursa (job #704658) | Cod sursa (job #2935027) | Cod sursa (job #696290)
Cod sursa(job #696290)
#include <cstdio>
#include <cstring>
#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;
}