Pagini recente » Cod sursa (job #1092753) | Cod sursa (job #1067949) | Cod sursa (job #2491844) | Cod sursa (job #1299748) | Cod sursa (job #2965864)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
//algoritmul lui Hopcroft Karp
int noduriL, noduriR, nrMuchii;
int distanta[20001], l[20001], r[20001];
vector<int> graf[20001];
queue<int> q;
bool bfs() {
for (int i = 1; i <= noduriL; i++)
if (!r[i]) {
///daca e liber, il bagam in coada
q.push(i);
distanta[i] = 0;
}
else
distanta[i] = INT_MAX;
distanta[0] = INT_MAX;
while (!q.empty()) {
int node = q.front();
q.pop();
if (distanta[node] < distanta[0]) {
for (auto urm: graf[node]) {
if (distanta[l[urm]] == INT_MAX) {
distanta[l[urm]] = 1 + distanta[node];
q.push(l[urm]);
}
}
}
}
return distanta[0] != INT_MAX; ///lant
}
bool dfs(int node)
{
if(node != 0)
{
for(auto nextNod : graf[node])
if(distanta[node] + 1 == distanta[l[nextNod]] && dfs(l[nextNod]))
{
l[nextNod] = node;
r[node] = nextNod;
return true;
}
distanta[node] = INT_MAX;
return false;
}
return true;
}
int makePair()
{
int cuplaMax = 0;
while(bfs())
{
for(int i = 1 ; i <= noduriL ; i++)
if(!r[i] && dfs(i))
cuplaMax++;
}
return cuplaMax;
}
int main(){
fin >> noduriL >> noduriR >> nrMuchii;
fill(l, l + 20001, 0);
fill(r, r + 20001, 0);
for(int i = 1 ; i <= nrMuchii ; i++)
{
int u, v;
fin >> u >> v;
graf[u].push_back(v);
}
fout << makePair() << endl;
for(int i = 1 ; i <= noduriR ; i++)
if(l[i])
fout << l[i] << ' ' << i << endl;
return 0;
}