完全圖上的最小生成樹
此類問題一般採用某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)\)
求完全圖的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)\) 已經連通了才會考慮 \((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\)
解法
還沒做待填