Pagini recente » Cod sursa (job #624303) | Cod sursa (job #946627) | Cod sursa (job #97032) | Cod sursa (job #1125279) | Cod sursa (job #1625264)
#include <fstream>
#include <vector>
using namespace std;
vector <int> G[20005],cuplat;
int n,m,e,viz[20005],deviz;
void read();
void cupleaza(int,int);
int dfs(int);
void solve();
void write();
int main(){
read();
solve();
write();
return 0;
}
void read(){
freopen("cuplaj.in","r",stdin);
scanf("%d%d%d",&n,&m,&e);
for (int i=1;i<=e;i++){
int x,y;
scanf("%d%d",&x,&y);
G[x].push_back(y+n);
G[y+n].push_back(x);
}
}
void solve(){
cuplat.resize(n+m+1);
int rez=1;
while (rez){
rez=0;
deviz++;
for (int i=1;i<=n+m;i++){
if (!cuplat[i]&&viz[i]<deviz){
rez|=dfs(i);
}
}
}
}
int dfs(int x){
viz[x]=1;
for (int i=0;i<G[x].size();i++){
int y=G[x][i];
if (viz[y]<deviz){
viz[y]=deviz;
if (cuplat[y]){
if (dfs(cuplat[y])){
cupleaza(x,y);
cuplat[0]++;
return 1;
}
}
else {
cupleaza(x,y);
cuplat[0]++;
return 1;
}
}
}
return 0;
}
void cupleaza(int a,int b){
cuplat[cuplat[a]]=0;
cuplat[cuplat[b]]=0;
cuplat[a]=b;
cuplat[b]=a;
}
void write(){
freopen("cuplaj.out","w",stdout);
int nr=0;
for (int i=1;i<=n;i++){
if (cuplat[i]){
nr++;
}
}
printf("%d\n",nr);
for (int i=1;i<=n;i++){
if (cuplat[i]){
printf("%d %d\n",i,cuplat[i]-n);
}
}
}