Pagini recente » Cod sursa (job #389602) | Cod sursa (job #2586810) | Cod sursa (job #2588240) | Cod sursa (job #3274982) | Cod sursa (job #2696125)
#include<bits/stdc++.h>
using namespace std;
#define N 10010
#define INF 100010
int n,m;
vector<int> adj[N];
int pairU[N], pairV[N], dist[N];
int ans;
bool bfs(){
queue<int> q;
for(int i = 1;i<=n;i++){
if(pairV[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(auto v: adj[u]){
if(dist[pairU[v]] == INF){
dist[pairU[v]] = dist[u] + 1;
q.push(pairU[v]);
}
}
}
}
return dist[0] != INF;
}
bool dfs(int u){
if(u == 0)
return true;
for(auto v: adj[u]){
if(dist[pairU[v]] == dist[u] + 1){
if(dfs(pairU[v])){
pairU[v] = u;
pairV[u] = v;
return true;
}
}
}
dist[u] = INF;
return false;
}
void cuplaj(){
while(bfs()){
for(int i = 1;i<=n;i++){
if(pairV[i] == 0){
if(dfs(i)){
ans++;
}
}
}
}
}
int main(){
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
int e;
cin>>n>>m>>e;
for(int i = 0; i<e;i++){
int a, b;
cin>>a>>b;
adj[a].push_back(b);
}
cuplaj();
cout<<ans<<'\n';
for(int i = 1;i<=n;i++){
if(pairV[i])
cout<<i<<' '<<pairV[i]<<'\n';
}
return 0;
}