Pagini recente » Cod sursa (job #929776) | Cod sursa (job #2745121) | Cod sursa (job #3174526) | Cod sursa (job #65682) | Cod sursa (job #2975451)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f ("cuplaj.in");
ofstream g ("cuplaj.out");
const int SIZE = 10005;
const int INF = 0x3f3f3f3f;
int st, dr, ans;
vector <int> adj[SIZE];
vector <int> pair_st(SIZE, 0);
vector <int> pair_dr(SIZE, 0);
vector <int> dist(SIZE, 0);
void Read()
{
int len;
f >> st >> dr >> len;
for (int i = 1; i <= len; i++)
{
int x, y;
f >> x >> y;
adj[x].push_back(y);
}
}
bool BFS()
{
queue <int> q;
for (int i = 1; i <= st; i++)
{
if (pair_st[i] == 0)
{
dist[i] = 0;
q.push(i);
}
else
{
dist[i] = INF;
}
}
dist[0] = INF;
while (q.empty() == false)
{
int node = q.front();
q.pop();
if (dist[node] < dist[0])
{
for (unsigned int i = 0; i < adj[node].size(); i++)
{
int neighbour = adj[node][i];
if (dist[pair_dr[neighbour]] == INF)
{
dist[pair_dr[neighbour]] = dist[node] + 1;
q.push(pair_dr[neighbour]);
}
}
}
}
return (dist[0] != INF);
}
bool DFS(int node)
{
if (node != 0)
{
for (unsigned int i = 0; i < adj[node].size(); i++)
{
int neighbour = adj[node][i];
if (dist[pair_dr[neighbour]] == dist[node] + 1)
{
if (DFS(pair_dr[neighbour]) == true)
{
pair_dr[neighbour] = node;
pair_st[node] = neighbour;
return true;
}
}
}
dist[node] = INF;
return false;
}
return true;
}
void HopkroftKarp()
{
while (BFS() == true)
{
for (int i = 1; i <= st; i++)
{
if (pair_st[i] == 0 && DFS(i) == true)
{
ans++;
}
}
}
}
void Print()
{
g << ans << "\n";
for (int i = 1; i <= st; i++)
{
if (pair_st[i] != 0)
{
g << i << " " << pair_st[i] << "\n";
}
}
}
int main()
{
Read();
HopkroftKarp();
Print();
return 0;
}