1. 程式人生 > 其它 >完全圖上的最小生成樹

完全圖上的最小生成樹

此類問題一般採用某B開頭的最小生成樹演算法,而且並不會顯式使用。

CF888G

題意

給定一個 \(n\) 個點的完全圖。每個點有一個權值 \(a_i\) ,連線 \(i,j\) 兩點之間的邊權為 \(a_i\) \(xor\) \(a_j\)

其中 \(1\leq n \leq 10^5\)

解法

求異或最小值,考慮trie樹。
發現任意兩點間的邊權對應trie樹上的 \(LCA\)
同時 \(LCA\) 也為其子樹中最優連邊。
構造出 trie 樹,然後大力合併左右節點即可。

Tree MST

題意

給定一棵 \(n\) 個節點的樹,現有有一張完全圖,兩點 \(x,y\) 之間的邊長為 \(w[x]+w[y]+dis(x,y)\)

,其中 \(dis\) 表示樹上兩點的距離。
求完全圖的MST。

解法

放到樹上了。
若兩點之間連邊,最優路徑一定經過 \(LCA\)
可是這裡不再具備上題每個點最多有兩個兒子的約束了,怎麼辦?
\(p_i=dis(i,LCA)+w_i\) ,則過 \(LCA\) 的最優解必然為所有子樹的最小 \(p_i\) 間的連邊。
進一步的,子樹中兩個點 \(u,v\) 的邊權即為 \(p_u+p_v\)。可知只需將所有子樹中最小 \(p_u\) 與其他所有點。
採用點分治,最多會產生 \(O(nlogn)\) 條邊,進行克魯斯卡爾即可。

ZigZag MST

題意

對一張 \(n\) 個點的圖做 \(Q\)

次加邊操作,每次給定 \(A_i, B_i, C_i\),然後按順序連邊 \((A_i,B_i,C_i),(A_i,B_i+1,C_i+1),(A_i+1,B_i+1,C_i+2)\)等等,求給定圖的最小生成樹。

解法

鬼畜題。
每次加入的邊遞增,則 \((A_i,B_i)\) 已經連通了才會考慮 \((A_i,B_i+1,C_i+1)\) 的連邊。
既然這樣,不妨換一個連邊方式。
\((A_i,A_{i+1})\) 之間連一條權值為 \(C+1\) 的邊,\((B_i,B_{i+1})\) 之間連一條權值為 \(C+1\) 的邊....
然後 \((A_i,B_i)\) 之間連一條權值為 \(C\)

的邊。

這樣的轉化不會使答案變得更劣。
然後用線段樹或者什麼東西維護連邊最小值,最後的邊數為 \(O(n+q)\)
跑克魯斯卡爾即可

口糊題

題意

給定一棵 \(n\) 個節點的樹,現有有一張完全圖,兩點 \(x,y\) 之間的邊長為 \(max(w[x],w[y])+dis(x,y)\) ,其中 \(dis\) 表示樹上兩點的距離。
求完全圖的MST。

解法

還沒做待填

河童重工

題意

給定兩棵 \(n\) 個點的帶邊權樹。
求包含 \(n\) 個點的,\(i\)\(j\) 之間邊權為 \(d_1(i,j)+d_2(i,j)\) 的完全圖的最小生成樹大小。
其中 \(dx(i,j)\) 表示 \(i\)\(j\) 兩點在第 \(x\) 棵樹上的距離

\(1≤n≤10^5,0≤w≤500\)

解法

還沒做待填