Pagini recente » Cod sursa (job #1269046) | Cod sursa (job #1179647) | Cod sursa (job #41199) | Cod sursa (job #1440362) | Cod sursa (job #128171)
Cod sursa(job #128171)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const char iname[] = "strazi.in";
const char oname[] = "strazi.out";
#define MAXN 256
vector <int> G[MAXN];
int n;
int l[MAXN], r[MAXN]; bool u[MAXN];
FILE *fout;
void read_in(void)
{
FILE *fin = fopen(iname, "r");
int cnt, x, y;
fscanf(fin, "%d %d", &n, &cnt);
for (; cnt > 0; -- cnt)
{
fscanf(fin, "%d %d", &x, &y);
G[x].push_back(y);
}
fclose(fin);
}
int pairup(int n)
{
if (u[n])
return 0;
u[n] = true;
vector <int>::iterator i;
for (i = G[n].begin(); i != G[n].end(); ++ i) if (!r[*i]) {
l[n] = *i, r[*i] = n;
return 1;
}
for (i = G[n].begin(); i != G[n].end(); ++ i) if (pairup(r[*i])) {
l[n] = *i, r[*i] = n;
return 1;
}
return 0;
}
void print(int x)
{
u[x] = true;
if (!l[x]) {
for (int i = 1; i <= n; ++ i) if (!u[i] && !r[i]) {
fprintf(fout, "%d %d\n", x, i);
l[x] = i;
print(i);
break ;
}
return ;
}
print(l[x]);
}
int main(void)
{
read_in();
int cnt = 0, i, s;
for (i = 1; i <= n; ++ i)
cnt += pairup(i);
while (cnt > 0) {
memset(u, 0, sizeof(u));
cnt = 0;
for (i = 1; i <= n; ++ i) if (!l[i])
cnt += pairup(i);
}
cnt = 0;
for (i = 1; i <= n; ++ i) if (!r[i])
cnt ++;
fout = fopen(oname, "w");
fprintf(fout, "%d\n", cnt - 1);
memset(u, 0, sizeof(u));
for (i = 1; i <= n; ++ i) if (!r[i]) {
print(i), s = i;
break ;
}
for (i = 1; i <= n; ++ i, s = l[s])
fprintf(fout, "%d ", s);
return 0;
}