題意簡述
給定 \(n\) 個點 \(m\) 條邊,每條邊分為關鍵邊和非關鍵邊,你需要構造一條迴路,使得每條邊被至多經過一次,而關鍵邊恰好被經過了一次,無解輸出 -1
。保證所有關鍵邊將原圖連通。
\(n,m\le5\times10^5\)。
分析
先做一個比較關鍵的題意轉化:求是否可以將圖上的一些非關鍵邊刪掉,使得原圖存在尤拉回路。
而尤拉回路存在的充要條件是圖連通且所有點的度數為偶數,由於圖保證連通所以只需考慮後一個條件。設 \(deg_i\) 表示 \(i\) 點度數的奇偶性。“加入一條邊”就相當於反轉邊的端點的奇偶性。由於關鍵邊必然存在,所以先強制把關鍵邊加入,問題轉化為現在每個點有一個 \(deg_i\) 的權值,可以選擇一些邊加入,使得所有點的 \(deg_i=0\)。
而這是一個經典問題:對所有非關鍵邊求出一顆 DFS 樹森林,考慮從下往上轉移,對於一條樹邊 \((u,v),dep_u<dep_v\),若 \(deg_v=1\),則選出這條邊;否則不選。若森林的每棵樹的根節點的 \(deg\) 都是 \(0\) 就合法,否則不合法。在此不做證明。還有一個小擴充套件:若有解,無論非樹邊選還是不選,都存在一個給樹邊定缺的方案使得解合法(只需要把非樹邊兩端在樹上的路徑上的邊狀態取反即可)。
求出來了要加入的非關鍵邊之後只需要建新圖跑尤拉回路即可。線性。