Pagini recente » Cod sursa (job #2697201) | Cod sursa (job #2697152) | Cod sursa (job #2570510) | Cod sursa (job #2689585) | Cod sursa (job #2690570)
#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){ //nu are pereche
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){ //inseamna ca are pereche
dist[pairU[v]] = dist[u] + 1;
q.push(pairU[v]);
}
}
}
}
return dist[0] != INF;
}
bool dfs(int u){
if(u == 0) //am gasit o cale in bfs de la u la un nod necuplat din V <---
return true; // |
for(auto v: adj[u]){ // |
if(dist[pairU[v]] == dist[u] + 1){ // |
if(dfs(pairU[v])){ // daca mai jos in dfs am gasit un nod necuplat ----
pairU[v] = u; // cuplam invers la intoarcere
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++; //se mai adauga un path
}
}
}
}
}
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;
}