給定無向圖,需找到一條路徑使得每條邊恰好遍歷一次(歐拉路徑)。關鍵在於從奇度頂點開始搜索,並即時刪除已遍歷邊,保證線性時間複雜度。
f 指針記錄反向邊索引,便於快速刪除。
void euler(int u) {
while (head[u] != -1) {
int v = head[u];
// 根據邊編號奇偶性標記答案
if (v & 1) ans[v ^ 1] = 0;
else ans[v] = 1;
// 刪除邊:從鏈表移除並更新反向邊
head[u] = es[v].n;
es[es[v ^ 1].f].n = es[v ^ 1].n;
d[es[v].y]--; d[es[v].x]--;
u = es[v].y;
}
}
euler,再處理剩餘非零度點(針對多連通分量)。時間 O(n+m),空間 O(n+m)。邊刪除技巧避免了 vis 數組的額外開銷,適合大規模稀疏圖。