Pagini recente » Cod sursa (job #2689609) | Cod sursa (job #1415179) | Cod sursa (job #1246610) | Cod sursa (job #1417203) | Cod sursa (job #226595)
Cod sursa(job #226595)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <vector>
using namespace std;
#define maxn 10010
int n, m, e, l, sol;
int g[maxn], gt[maxn];
vector <int> a[maxn], b[maxn];
int s[maxn], u[maxn], mark[maxn];
void cuplaj()
{
int i, j, x;
for (i=1; i<=n; i++)
{
l = 0;
for (j=0; j<g[i]; j++)
if (!u[a[i][j]]) s[l++] = a[i][j];
if (l)
{
sol++;
x = rand() % l;
u[s[x]] = 1;
mark[i] = s[x];
}
}
}
int main()
{
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
srand(time(0));
int i, j, x, y, time1;
time1 = time(0);
scanf("%d %d %d ", &n, &m, &e);
for (i=1; i<=e; i++)
{
scanf("%d %d ", &x, &y);
a[x].push_back(y);
b[y].push_back(x);
}
for (i=1; i<=n; i++) g[i] = a[i].size();
for (i=1; i<=m; i++) gt[i] = b[i].size();
cuplaj();
do
{
x = rand() % n + 1;
if (mark[x])
for (i=0, j = rand()%gt[mark[x]]; i<gt[mark[x]]; i++)
{
j++;
if (j == gt[mark[x]]) j = 0;
if (!mark[b[mark[x]][j]])
{
mark[b[mark[x]][j]] = mark[x];
mark[x] = 0;
break;
}
}
if (!mark[x])
for (i=0, j = rand()%g[x]; i<g[x]; i++)
{
j++;
if (j == g[x]) j = 0;
if (!u[a[x][i]])
{
sol++;
mark[x] = a[x][i];
u[a[x][i]] = 1;
break;
}
}
}
while (1.0 * (time(0)-time1) / CLOCKS_PER_SEC < 0.0000002);
printf("%d\n", sol);
for (i=1; i<=n; i++)
if (mark[i]) printf("%d %d\n", i, mark[i]);
return 0;
}