Pagini recente » Cod sursa (job #2023999) | Istoria paginii utilizator/tehnology | Cod sursa (job #2714554) | Cod sursa (job #131726) | Cod sursa (job #1131277)
#include <cstdio>
#include <vector>
#include <cstring>
#define NMAX 10001
using namespace std;
int st[NMAX];
int dr[NMAX];
int visited[NMAX];
int n,m,e,nr;
bool ok;
vector < vector < int > > Graf;
inline void read(){
int x,y;
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d%d%d",&n,&m,&e);
Graf.resize(2*n+1);
for(register int i=1;i<=e;++i){
scanf("%d%d",&x,&y);
Graf[x].push_back(y);
}
}
int Hopkroft_Karp(int node){
if(visited[node])
return 0;
visited[node] = 1;
for(vector < int > ::iterator it = Graf[node].begin();it!=Graf[node].end();++it)
if(!dr[*it] || Hopkroft_Karp(dr[*it])){
st[node] = *it;
dr[*it] = node;
return 1;
}
return 0;
}
inline void solve(){
ok = 1;
while(ok){
ok = 0;
for(register int i=1;i<=n;++i){
if(!st[i])
if(Hopkroft_Karp(i))
ok = 1 , ++nr;
memset(visited,0,sizeof(visited));
}
}
printf("%d\n",nr);
for(register int i=1;i<=n;++i)
if(st[i])
printf("%d %d\n",i,st[i]);
}
int main(){
read();
solve();
return 0;
}