求出欧拉回路,欧拉路径
注意, qsz 应该是从2开始的 因为用到了^1
无向图
#include <cstdio> #include <cstring> using namespace std; const int maxn = 1e3+50; struct Edge{ int st; int lst; int to; }edge[maxn*5]; int head[maxn]; int qsz; inline void add(int u, int v) { edge[qsz].st = u; edge[qsz].lst = head[u]; edge[qsz].to = v; head[u] = qsz++; } int in[maxn]; int ans[5*maxn]; bool vis[5*maxn*2]; int qcnt; void dfs(int u) { int i; for (i=head[u]; i; i=edge[i].lst) { if (!vis[i]) { vis[i] = true; vis[i^1] = true; dfs(edge[i].to); // ans[q++] = i; //记录回路的边. } } ans[qcnt++] = u; // 记录回路的点 // 答案是与起点颠倒的. } int main() { int t, n, m, i, j, u, v; // init; qsz = 2; memset(head, 0, sizeof(head)); qcnt = 0; scanf("%d%d", &n, &m); for (i=1; i<=m; ++i) { scanf("%d%d", &u, &v); add(u, v); add(v, u); in[v]++; in[u]++; } bool flag = true; for (i=1; i<=n; ++i) if (in[i] & 1) { dfs(i); flag = false; break; } if (flag) dfs(1); // 例如两个骨牌是 (1, 2) (1, 2) 这样的情况,两个端点就不是奇数次出现. 这个时候随便选一个作为起点就OK. for (i=0; i<qcnt; ++i) printf("%d ", ans[i]); return 0; }