Pagini recente » Monitorul de evaluare | Cod sursa (job #1553600) | Cod sursa (job #2017637) | Cod sursa (job #221356) | Cod sursa (job #1274047)
#include <cstdio>
#include <vector>
#define nmax 10010
#include <queue>
#include <cstring>
using namespace std;
vector < int > graph[nmax];
int n,m,e,sum;
queue < int > q;
int pair1[nmax],pair2[nmax];
bool u[nmax];
void read(){
int x,y;
scanf("%d %d %d ",&n ,&m ,&e );
while(e--){
scanf("%d %d ",&x,&y);
graph[x].push_back(y);
}
}
bool link(int k){
if(u[k])
return false;
u[k] = true;
for(vector < int > :: iterator it = graph[k].begin() ; it != graph[k].end() ; ++it){
if(!pair2[*it]){
pair1[k] = *it;
pair2[*it] = k;
return 1;
}
}
for(vector < int > :: iterator it = graph[k].begin() ; it != graph[k].end() ; ++it){
if(link(pair2[*it])){
pair1[k] = *it;
pair2[*it] = k;
return 1;
}
}
return 0;
}
void hopcraft_karp(){
bool k = 1;
int i;
while(k){
k = 0;
memset(u,0,sizeof(u));
for( i = 1 ; i <= n ; ++i){
if(!pair1[i]){
k |= link(i);
}
}
}
for( i = 1 ; i <= n;++i){
if(pair1[i])sum++;
}
printf("%d\n",sum);
for( i = 1; i <= n ; i++)if(pair1[i])printf("%d %d\n",i,pair1[i]);
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
read();
hopcraft_karp();
return 0;
}