Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Monitorul de evaluare | Diferente pentru utilizator/2016 intre reviziile 6 si 3 | Cod sursa (job #3360321)
#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[200005];
vector<int> pereche_st, pereche_dr;
vector<int> dist;
int bfs(){
queue<int> q;
for(int i=1;i<=n;i++){
if(pereche_st[i]==0){
q.push(i);
dist[i]=0;
}
else{
dist[i]=INF;
}
}
dist[0]=INF;
while(!q.empty()){
int u=q.front();
q.pop();
if(dist[u]<dist[0]){
for(int v:adj[u]){
if(dist[pereche_dr[v]]==INF){
dist[pereche_dr[v]]=dist[u]+1;
q.push(pereche_dr[v]);
}
}
}
}
return dist[0]!=INF;
}
int dfs(int u){
if(u!=0){
for(int v:adj[u]){
if(dist[pereche_dr[v]]==dist[u]+1){
if(dfs(pereche_dr[v])){
pereche_st[u]=v;
pereche_dr[v]=u;
return true;
}
}
}
dist[u]=INF;
return false;
}
return true;
}
int hopcroft_karp(){
pereche_st.assign(n+1, 0);
pereche_dr.assign(n+m+1, 0);
dist.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';
}
}
}