Pagini recente » Cod sursa (job #1832005) | Cod sursa (job #1150863) | Cod sursa (job #1116353) | Cod sursa (job #2840389) | Cod sursa (job #2958612)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int n, m, cuplajMax;
vector<int> st, dr, dist;
vector<vector<int>> adj;
queue<int> coada;
bool BFS()
{
int i, currentNode, j;
for(i = 1 ; i <= n ; i++)
if(dr[i] == 0)
{
dist[i] = 0;
coada.push(i);
}
else
dist[i] = INT_MAX;
dist[0] = INT_MAX;
while(!coada.empty())
{
currentNode = coada.front();
coada.pop();
if(dist[currentNode] < dist[0])
{
for(j = 0; j < adj[currentNode].size(); j++)
{
if(dist[st[adj[currentNode][j]]] == INT_MAX)
{
dist[st[adj[currentNode][j]]] = dist[currentNode] + 1;
coada.push(st[adj[currentNode][j]]);
}
}
}
}
return dist[0] != INT_MAX;
}
bool DFS(int currentNode)
{
int i;
if(currentNode != 0)
{
for(i = 0; i < adj[currentNode].size(); i++)
if(dist[currentNode] + 1 == dist[st[adj[currentNode][i]]] && DFS(st[adj[currentNode][i]]))
{
st[adj[currentNode][i]] = currentNode;
dr[currentNode] = adj[currentNode][i];
return true;
}
dist[currentNode] = INT_MAX;
return false;
}
return true;
}
void HopcroftKarp()
{
int i;
while(BFS())
for(i = 1 ; i <= n ; i++)
if(dr[i] == 0 && DFS(i))
cuplajMax++;
}
int main()
{
int i, nod1, nod2, e;
in >> n >> m >> e;
st.resize(n + 1, 0);
dr.resize(n + 1, 0);
adj.resize(n + m + 1);
dist.resize(n + 1, 0);
for(i = 1 ; i <= e ; i++)
{
in >> nod1 >> nod2;
adj[nod1].push_back(nod2);
}
HopcroftKarp();
out << cuplajMax << '\n';
for(i = 1 ; i <= m ; i++)
if(st[i] != 0)
out << st[i] << " " << i << '\n';
return 0;
}