Pagini recente » Cod sursa (job #1042745) | Cod sursa (job #85140) | Cod sursa (job #1118647) | Cod sursa (job #1707737) | Cod sursa (job #1825669)
#include <cstdio>
#include <cstring>
#include <vector>
#define MAXN 10000
std::vector <int> G[2*MAXN+2];
inline void add_Edge(int x,int y){
G[x].push_back(y);
}
int v[MAXN+1];
bool viz[MAXN+1];
bool cauta(int nod){
int x;
for(auto x:G[nod])
if(v[x]==0){
v[x]=nod;
v[nod]=x;
return 1;
}
viz[nod]=1;
for(auto x:G[nod])
if(viz[v[x]]==0&&cauta(v[x])){
v[x]=nod;
v[nod]=x;
return 1;
}
return 0;
}
int main(){
FILE*fi,*fout;
int i,n,m,e,x,y,flag,ans;
fi=fopen("cuplaj.in" ,"r");
fout=fopen("cuplaj.out" ,"w");
fscanf(fi,"%d %d %d " ,&n,&m,&e);
for(i=1;i<=e;i++){
fscanf(fi,"%d %d " ,&x,&y);
y+=n;
add_Edge(x,y);
add_Edge(y,x);
}
flag=1;
while(flag){
flag=0;
memset(viz,0,sizeof(viz));
for(i=1;i<=n;i++)
if(v[i]==0)
flag|=cauta(i);
}
ans=0;
for(i=1;i<=n;i++)
if(v[i]>0)
ans++;
fprintf(fout,"%d\n" ,ans);
for(i=1;i<=n;i++)
if(v[i]>0)
fprintf(fout,"%d %d\n" ,i,v[i]-n);
fclose(fi);
fclose(fout);
return 0;
}