欧拉路问题。
有回路,有纯粹的欧拉路。
欧拉路算法:
所有点的入度出度有一个特殊的关系。
假如不是欧拉回路,只是欧拉路,那么…… 一个点的出度=入度+1 就是起点 入度=出度+1 就是终点
假如是欧拉回路,那就随意了。
欧拉路的遍历,需要后序遍历,倒序输出。 如果用前序遍历,正序输出, 会出现一个如下问题:
A->B
B->A
A->B
B->C
显然应该是 A B A B C
但是前序遍历会走路成:ABC ?? 一旦显走了ABC,就不对了…… 但是后面也明明可以是圈的~ 所以要后续遍历
相关证明略
Executing... Test 1: TEST OK [0.003 secs, 3516 KB] Test 2: TEST OK [0.003 secs, 3516 KB] Test 3: TEST OK [0.003 secs, 3516 KB] Test 4: TEST OK [0.003 secs, 3516 KB] Test 5: TEST OK [0.003 secs, 3516 KB] Test 6: TEST OK [0.003 secs, 3516 KB] Test 7: TEST OK [0.003 secs, 3516 KB] Test 8: TEST OK [0.005 secs, 3516 KB] All tests OK.
/*
TASK:fence
LANG:C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std;
int paths;
struct edge
{
int dot;
bool vis;
edge *next;
edge *rel;
edge (int t, edge *p)
{
dot = t;
next = p;
vis = false;
}
edge(){}
}*e[505];
int degree[505];
inline void insert(int x, int y)
{
e[x] = new edge(y, e[x]);
}
int st, ed;
typedef pair<int, edge*> PIE;
PIE sort_tmp[1000];
void list_qsort(edge *&a)
{
int t = 0;
while (a)
{
sort_tmp[t ++] = make_pair(-a -> dot, a);
a = a -> next;
}
sort(sort_tmp, sort_tmp + t);
for (int i = 0; i != t; ++ i)
{
sort_tmp[i].second -> next = a;
a = sort_tmp[i].second;
}
}
void pg(edge *a)
{
while (a)
{
cout << a -> dot << " ";
a = a -> next;
}
cout<<endl;
}
void init()
{
scanf("%d", &paths);
while (paths--)
{
int a, b;
scanf("%d%d", &a, &b);
++ degree[a];
++ degree[b];
insert(a, b);
insert(b, a);
e[a] -> rel = e[b];
e[b] -> rel = e[a];
}
for (int i = 1; i <= 500; ++ i) list_qsort(e[i]);
for (int i = 1; i <= 500; ++ i)
if (degree[i])
{
st = ed = i;
break;
}
for (int i = 1; i <= 500; ++ i)
if (degree[i] % 2)
{
st = i;
break;
}
for (int i = 500; i >= 1; -- i)
if (degree[i] % 2)
{
ed = i;
break;
}
}
int output[1000], tail = 0;
void dfs(int s)
{
for (edge *i = e[s]; i; i = i -> next)
{
if (!i -> vis)
{
i -> vis = true;
i -> rel -> vis = true;
}else continue;
int will = i -> dot;
dfs(will);
output[tail++] = s;
}
}
void doit()
{
dfs(st);
for (int i = tail - 1; i >= 0; -- i) printf("%d\n", output[i]);
printf("%d\n", ed);
}
int main()
{
freopen("fence.in", "r", stdin);
freopen("fence.out", "w", stdout);
init();
doit();
return 0;
}