Pagini recente » Cod sursa (job #1052787) | Cod sursa (job #377472) | Cod sursa (job #2880796) | Cod sursa (job #2190849) | Cod sursa (job #2163753)
#include <bits/stdc++.h>
#define INFILE "cuplaj.in"
#define OUTFILE "cuplaj.out"
#define NIL 0
using namespace std;
ifstream in(INFILE);
ofstream out(OUTFILE);
const int INF=INT_MAX;
int M,N;
struct Arbore{
vector<vector<int>> Adj;
void init(int n){
Adj.resize(n+1);
}
void Add(int x,int y){
Adj[x].push_back(y);
Adj[y].push_back(x);
}
}A;
bool BFS(int dist[],int pairU[],int pairV[],int m){
queue<int> coada;
for(int u=1;u<=m;u++){
if(pairU[u]==NIL){
dist[u]=0;
coada.push(u);
}
else{
dist[u]=INF;
}
}
dist[NIL]=INF;
while(!coada.empty()){
int u=coada.front();
coada.pop();
for(auto v:A.Adj[u]){
v-=m;
if(dist[pairV[v]]==INF){
dist[pairV[v]]=dist[u]+1;
coada.push(pairV[v]);
}
}
}
return (dist[NIL]!=INF);
}
bool DFS(int u,int dist[],int pairU[],int pairV[],int m){
if(u!=NIL){
for(auto v:A.Adj[u]){
v-=m;
if(dist[pairV[v]]==dist[u]+1){
if(DFS(pairV[v],dist,pairU,pairV,m)){
pairV[v]=u;
pairU[u]=v;
return true;
}
}
}
dist[u]=INF;
return false;
}
return true;
}
void HopcroftKarp(int m,int n){
int pairU[n+m+1];
int pairV[m+n+1];
int dist[n+m+1];
memset(pairU,NIL,sizeof(pairU));
memset(pairV,NIL,sizeof(pairV));
int result=0;
while(BFS(dist,pairU,pairV,m)){
//cout<<"DA\n";
for(int u=1;u<=m;u++){
if(pairU[u]==NIL&&(DFS(u,dist,pairU,pairV,m)))
result++;
}
}
out<<result<<"\n";
for(int i=1;i<=M;i++){
if(pairU[i]==NIL) continue;
out<<i<<" "<<pairU[i]<<"\n";
}
}
void Read(){
int E;
in>>M>>N>>E;
A.init(M+N);
for(int i=1;i<=E;i++){
int x,y;
in>>x>>y;
A.Add(x,M+y);
}
}
int main(){
Read();
HopcroftKarp(M,N);
return 0;
}