Pagini recente » Cod sursa (job #350586) | Cod sursa (job #1678526) | Cod sursa (job #1816774) | Cod sursa (job #956911) | Cod sursa (job #2739148)
#include <fstream>
#include <vector>
#include <queue>
#define MAX_SIZE 100005
#define INF 0x3F3F3F3F
#define DUMMY 0
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector<int> graph[MAX_SIZE];
int pairU[MAX_SIZE], pairV[MAX_SIZE];
int dist[MAX_SIZE];
int n, m, e;
void init()
{
for(int i = 1; i<=n; i++)
pairU[i] = DUMMY;
for(int i = 1; i<=m; i++)
pairV[i] = DUMMY;
}
void read()
{
int u, v;
f>>n>>m>>e;
for(int i = 0; i<e; i++)
{
f>>u>>v;
graph[u].push_back(v);
}
}
bool bfs()
{
queue<int> Q;
for(int i = 1; i<=n; i++)
{
if(pairU[i] == 0)
{
dist[i] = 0;
Q.push(i);
}
else
dist[i] = INF;
}
dist[DUMMY] = INF;
while(!Q.empty())
{
int u = Q.front();
Q.pop();
if(dist[u] < dist[DUMMY])
{
for(auto &v : graph[u])
{
if(dist[pairV[v]] == INF)
{
dist[pairV[v]] = dist[u] + 1;
Q.push(pairV[v]);
}
}
}
}
return dist[DUMMY] != INF;
}
bool dfs(int u)
{
if(u != DUMMY)
{
for(auto &v : graph[u])
{
if(dist[pairV[v]] == dist[u] + 1)
{
if(dfs(pairV[v]))
{
pairV[v] = u;
pairU[u] = v;
return true;
}
}
}
dist[u] = INF;
return false;
}
return true;
}
void solve()
{
int sol = 0;
while(bfs())
{
for(int u = 1; u <= n; u++)
if(pairU[u] == DUMMY && dfs(u))
sol++;
}
g<<sol<<"\n";
}
void print()
{
for(int u = 1; u<=n; u++)
{
if(pairU[u] != DUMMY)
{
g<<u<<" "<<pairU[u]<<"\n";
}
}
}
int main()
{
init();
read();
solve();
print();
return 0;
}