Pagini recente » Cod sursa (job #1650404) | Cod sursa (job #3189856) | Cod sursa (job #220340) | Cod sursa (job #537147) | Cod sursa (job #2582329)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int INF = 0x3f3f3f3f;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector<int> adj[10041];
int paira[10041], pairb[10041];
int dist[10041];
int n, m, e;
void read(){
fin >> n >> m >> e;
for(int i = 0; i < e; ++i){
int a, b;
fin >> a >> b;
adj[a].push_back(b);
}
}
queue<int> qu;
bool bfs(){
for(int a = 1; a <= n; ++a){
if(paira[a] == 0){
qu.push(a);
dist[a] = 0;
}else{
dist[a] = INF;
}
}
dist[0] = INF;
while(!qu.empty()){
int a = qu.front();
qu.pop();
if(dist[a] < dist[0]){
for(auto b : adj[a]){
if(dist[pairb[b]] == INF){
dist[pairb[b]] = dist[a]+1;
qu.push(pairb[b]);
}
}
}
}
// cout << dist[0] << " ";
return dist[0]!=INF;
}
bool dfs(int a){
if(a == 0){
return true;
}
for(auto b : adj[a]){
if(dist[pairb[b]] == dist[a]+1 && dfs(pairb[b])){
paira[a] = b;
pairb[b] = a;
return true;
}
}
dist[a] = INF;
return false;
}
int ans = 0;
void solve(){
while(bfs()){
for(int a = 1; a <= n; ++a){
if(paira[a] == 0 && dfs(a)){
ans++;
}
}
}
}
void write(){
fout << ans << "\n";
for(int a = 1; a <= n; ++a){
if(paira[a] != 0){
fout << a << " " << paira[a] << "\n";
}
}
}
int main(){
read();
solve();
write();
return 0;
}