Pagini recente » Cod sursa (job #1581477) | Cod sursa (job #1721081) | Cod sursa (job #698815) | Cod sursa (job #1177142) | Cod sursa (job #1727401)
#include <iostream>
#include <fstream>
#include <climits>
#include <queue>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
vector<vector<int> > L;
int n,m,e;
vector<int> dist;
vector<int> pair_U;
vector<int> pair_V;
int result=0;
bool BFS()
{
queue<int> q;
for (int i = 1; i <= n; i++)
{
if (pair_U[i] == 0)
{
dist[i] = 0;
q.push(i);
}
else
{
dist[i] = INT_MAX;
}
}
dist[0] = INT_MAX;
while (!q.empty())
{
int node = q.front();
q.pop();
if (dist[node] < dist[0])
{
for (int i = 0; i<L[node].size();i++)
{
if (dist[pair_V[L[node][i]]] == INT_MAX)
{
dist[pair_V[L[node][i]]] = dist[node] + 1;
q.push(pair_V[L[node][i]]);
}
}
}
}
return dist[0] != INT_MAX;
}
bool dfs (int x)
{
if (x != 0)
{
for (int i = 0; i < L[x].size(); i++)
{
if (dist[pair_V[L[x][i]]] == dist[x] + 1)
{
if (dfs(pair_V[L[x][i]]) == true)
{
pair_V[L[x][i]] = x;
pair_U[x] = L[x][i];
return true;
}
}
}
dist[x] = INT_MAX;
return false;
}
return true;
}
int main ()
{
fin>>n>>m>>e;
L.resize(n+1);
dist.resize(n+1);
pair_U.resize(n+1,0);
pair_V.resize(m+1,0);
for (int i = 1; i <= e; i++)
{
int u,v;
fin>>u>>v;
L[u].push_back(v);
}
while (BFS())
{
for (int i = 1; i <= n; i++)
{
if (pair_U[i] == 0 && dfs(i))
{
result++;
}
}
}
fout<<result<<endl;
for (int i = 1; i <= n; i++)
{
if (pair_U[i] != 0)
{
fout<<i<<" "<<pair_U[i]<<endl;
}
}
}