Pagini recente » Cod sursa (job #3631) | Cod sursa (job #107385) | Profil CiurelVictor | Cod sursa (job #560003) | Cod sursa (job #2709058)
#include <iostream>
#include <fstream>
#include <vector>
#include <string.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
const int N = 10005;
int n, m, e;
vector<int> g[N], isCoupled;
bool vis[N * 2];
bool match(int node)
{
if(vis[node])
return false;
vis[node] = true;
for(int vec : g[node])
{
if(isCoupled[vec] == -1)
{
isCoupled[vec] = node;
isCoupled[node] = vec;
return true;
}
}
for(int vec : g[node])
{
if(match(isCoupled[vec]))
{
isCoupled[vec] = node;
isCoupled[node] = vec;
return true;
}
}
return false;
}
int main()
{
fin >> n >> m >> e;
isCoupled.assign(n + m + 1, -1);
for(int i = 0; i < e; i++)
{
int x, y;
fin >> x >> y;
g[x].push_back(y+n);
}
bool ok;
do
{
memset(vis, false, sizeof(vis));
ok = false;
for(int i = 1; i <= n; i++)
if(isCoupled[i] == -1)
ok = ok || match(i);
}while(ok);
int coupled = 0;
for(int i = 1; i <= n; i++)
if(isCoupled[i] != -1)
coupled++;
fout << coupled << '\n';
for(int i = 1; i <= n; i++)
if(isCoupled[i] != -1)
{
fout << i << ' ' << isCoupled[i] - n << '\n';
}
fin.close();
fout.close();
return 0;
}
/*
*/