Pagini recente » Cod sursa (job #2686414) | Cod sursa (job #2686424) | Cod sursa (job #2686423) | Cod sursa (job #2673734) | Cod sursa (job #3360302)
#include <fstream>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
const int INF=1e9;
int n, m, q;
vector<int> adj[10005];
vector<int> pereche_st, pereche_dr;
vector<int> d;
int bfs(){
queue<int> q;
for(int i=1;i<=n;i++){
if(pereche_st[i]==0){
d[i]=0;
q.push(i);
}
else{
d[i]=INF;
}
}
d[0]=INF;
while(!q.empty()){
int u=q.front();
q.pop();
if(d[u]<d[0]){
for(int v:adj[u]){
if(d[pereche_dr[v]]==INF){
d[pereche_dr[v]]=d[u]+1;
q.push(pereche_dr[v]);
}
}
}
}
return (d[0]!=INF);
}
int dfs(int u){
if(u!=0){
for(int v:adj[u]){
if(d[pereche_dr[v]]==d[u]+1){
if(dfs(pereche_dr[v])){
pereche_dr[v]=u;
pereche_st[u]=v;
return true;
}
}
}
d[u]=INF;
return false;
}
return true;
}
int hopcroft_karp(){
pereche_st.assign(n+1, 0);
pereche_dr.assign(n+m+1, 0);
d.assign(n+1, 0);
int cuplaj=0;
while(bfs()){
for(int i=1;i<=n;i++){
if(pereche_st[i]==0&&dfs(i)){
cuplaj++;
}
}
}
return cuplaj;
}
int main(){
cin>>n>>m>>q;
for(int i=1;i<=q;i++){
int x, y;
cin>>x>>y;
adj[x].push_back(n+y);
}
cout<<hopcroft_karp()<<'\n';
for(int i=1;i<=n;i++){
if(pereche_st[i]!=0){
cout<<i<<" "<<pereche_st[i]-n<<'\n';
}
}
}