Pagini recente » Cod sursa (job #626177) | Cod sursa (job #2559041) | Cod sursa (job #591422) | Cod sursa (job #621481) | Cod sursa (job #1646822)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
#define MAXN 50005
vector < vector <int> > edge;
int used[MAXN], Left[MAXN], Right[MAXN];
int N, M, E;
bool link(int node)
{
used[node] = 1;
for (int i = 0; i <(int) edge[node].size(); ++i)
if (Right[edge[node][i]] == 0)
{
Right[edge[node][i]] = node;
Left[node] = edge[node][i];
return 1;
}
for (int i = 0; i <(int) edge[node].size(); ++i)
if (!used[Right[edge[node][i]]] && link(Right[edge[node][i]]))
{
Left[node] = edge[node][i];
Right[edge[node][i]] = node;
return 1;
}
return 0;
}
int main()
{
fin >>N >>M >>E;
edge.resize(N+1);
for (int i = 1; i <= E; ++i)
{
int x, y;
fin >>x >>y;
edge[x].push_back(y);
}
int ok = 1;
do
{
ok = 1;
fill(used, used+N+1, 0);
for(int i = 1; i <= N; ++i)
if(Left[i] == 0 && link(i))
ok=0;
}
while(ok == 0);
ok = 0;
for (int i = 1; i <= N; ++i)
if (Left[i] != 0)
++ok;
fout <<ok <<'\n';
for (int i = 1; i <= N; ++i)
if (Left[i] != 0)
fout <<i <<' ' <<Left[i] <<'\n';
return 0;
}