欧拉路是指经过图中所有边恰好一次的路径
存在欧拉路的充要条件是
每个点的度数都为偶数或者只有两个点度数为奇数
注意一下路径一定要记录在栈中
因为你可能先访问的点不一定是在路径上先走的
但是记录在栈中的话 就算先搜到了它也可以保证答案正确
直接放代码 之前因为
multiset
m
u
l
t
i
s
e
t
搞了好久.. 这种东西还是少用把..
模板链接
Codes
#include<bits/stdc++.h>
#define For(i, a, b) for(register int i = a; i <= b; ++ i)
#define FOR(i, a, b) for(register int i = a; i >= b; -- i)
#define PII pair<int, int>
#define mp make_pair
#define go(x, i) for(register int i = head[x]; i; i = nxt[i])
using namespace std;
const int maxn = 666, maxm = 2333;
int to[maxm << 1], head[maxn], nxt[maxm << 1], e = 1;
int n = 500, m, de[maxn], vis[maxn], Vis[maxm], ans[maxm], tot;
void add(int x, int y) {
to[++ e] = y;
nxt[e] = head[x];
head[x] = e;
}
void dfs(int x) {
priority_queue<PII, vector<PII>, greater<PII> >q;
go(x, i)
if(!Vis[i])
q.push(mp(to[i], i));
while(!q.empty()) {
PII k = q.top(); q.pop();
if(Vis[k.second]) continue;
Vis[k.second] = Vis[k.second ^ 1] = 1;
dfs(k.first);
}
ans[++ tot] = x;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("2731.in", "r", stdin);
freopen("2731.out", "w", stdout);
#endif
int x, y;
scanf("%d", &m);
For(i, 1, m) {
scanf("%d%d", &x, &y);
add(x, y), add(y, x);
++ de[x], ++ de[y];
vis[x] = vis[y] = true;
}
For(i, 1, n)
if(vis[i] && (de[i] & 1)) {
dfs(i);
FOR(j, tot, 1)
printf("%d\n", ans[j]);
return 0;
}
For(i, 1, n)
if(vis[i]) {
dfs(i);
FOR(j, tot, 1)
printf("%d\n", ans[j]);
return 0;
}
return 0;
}