Pagini recente » Cod sursa (job #1156440) | Cod sursa (job #83370) | Cod sursa (job #1597503) | Cod sursa (job #1177140) | Cod sursa (job #1543109)
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
vector<int> g[20010];
int seen[20010],answer=0,right_pair[10010],left_pair[10010];
int match(int node){
int i,dim=g[node].size();
seen[node]=1;
for(i=0;i<dim;i++)
if(left_pair[g[node][i]]==0){
answer++;
left_pair[g[node][i]]=node;
right_pair[node]=g[node][i];
return 1;
}
for(i=0;i<dim;i++)
if(seen[left_pair[g[node][i]]]==0)
if(match(left_pair[g[node][i]])==1){
left_pair[g[node][i]]=node;
right_pair[node]=g[node][i];
return 1;
}
return 0;
}
int main(){
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
int left,right,ok=1,i,m,a,b;
scanf("%d%d%d",&left,&right,&m);
for(i=1;i<=m;i++){
scanf("%d%d",&a,&b);
g[a].push_back(b);
}
while(ok==1){
ok=0;
memset(seen,0,sizeof(seen));
for(i=1;i<=left;i++)
if(right_pair[i]==0&&match(i)==1)
ok=1;
}
printf("%d\n",answer);
for(i=1;i<=left;i++)
if(right_pair[i]!=0)
printf("%d %d\n",i,right_pair[i]);
return 0;
}