Pagini recente » Cod sursa (job #235848) | Cod sursa (job #2661737) | Cod sursa (job #521252) | Diferente pentru preoni-2007/runda-finala/poze/la-masa intre reviziile 2 si 5 | Cod sursa (job #1549392)
// ConsoleApplication5.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <fstream>
#include<vector>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
const int N = 20000;
vector<int>v[N];
int l[N];
int na, nb;
int c[N];
int viz[N];
int dfs(int i)
{
int k, j;
viz[i] = 1;
for (j = 0; j<l[i]; j++)
{
k = v[i][j];
if (viz[k] || c[i] == k)continue;
viz[k] = 1;
if (c[k] == -1)
{
c[k] = i;
c[i] = k;
return 1;
}
else
{
if (dfs(c[k]))
{
c[i] = k;
c[k] = i;
return 1;
}
else continue;
}
}
return 0;
}
void greedy(int i)
{
for (int j = 0; j<l[i]; j++)
if (c[v[i][j]] == -1)
{
c[i] =v[i][j];
c[v[i][j]] = i;
break;
}
}
int main()
{
int ok = 0, i, j, x, y;
fin >> na >> nb >> j;
while (j--)
{
fin >> x >> y;
x--;
y = y + na - 1;
v[x].push_back(y);
l[x]++;
v[y].push_back(x);
l[y]++;
}
for (i = 0; i < na + nb; i++)c[i] = -1;
for (i = 0; i < na;i++)
if (c[i] == -1)
greedy(i);
while (!ok)
{
ok = 1;
for (i = 0; i < na + nb; i++)viz[i] = 0;
for (i = 0; i < na; i++)
if (!viz[i] && c[i] == -1)
if (dfs(i))
ok = 0;
}
int q = 0;
for (i = 0; i < na; i++)if (c[i] != -1)q++;
fout << q << '\n';
for (i = 0; i < na; i++)
if (c[i] != -1)
fout << i + 1 << " " << c[i] - na + 1 << '\n';
return 0;
}