Pagini recente » Cod sursa (job #433880) | Cod sursa (job #803558) | Cod sursa (job #199982) | Cod sursa (job #1535529) | Cod sursa (job #1450084)
#include <fstream>
#include <vector>
using namespace std;
static const int MAXN = 20009;
vector<int> G[MAXN];
int match[MAXN];
bool u[MAXN];
bool match_it(int who)
{
int vec;
bool success = false;
u[who] = true;
for(int i = 0, l = G[who].size() && !success; i < l; i++)
{
vec = G[who][i];
if(!u[vec] && vec != match[who]) // edge is white and node was not used
{
if(!match[vec]) //end of the ride
{
success = true;
}
else
{
success = match_it(match[vec]); //go black
}
if(success)
{
match[who] = vec;
match[vec] = who;
}
}
}
return success;
}
int main()
{
int n, m, e, x, y;
ifstream f("cuplaj.in");
f >> n >> m >> e;
for(int i = 0; i < e; i++)
{
f >> x >> y;
G[x].push_back(n + y);
G[n + y].push_back(x);
}
f.close();
for(int i = 1; i <= n + m; i++)
{
if(!match[i])
{
memset(u, 0, sizeof u);
match_it(i);
}
}
vector<pair<int, int> > ans;
for(int i = 1; i <= n; i++)
{
if(match[i])
{
ans.push_back(pair<int, int>(i, match[i] - n));
}
}
ofstream g("cuplaj.out");
g << ans.size() << '\n';
for(int i = 0, l = ans.size(); i < l; i++)
{
g << ans[i].first << ' ' << ans[i].second << '\n';
}
g.close();
return 0;
}