這道題是最小生成樹樹的變形。題目告訴你在其中已經新增過了一些邊,在剩下的邊中選取若干條使其成為乙個最小生成樹。
我記得上一次做真題是遇到類似的問題。我用了prime演算法求解。現在就換用了kruskal演算法。
根據查詢選把相應邊合併,這些邊不算入雖小生成樹的權值即可,接下來的就和kruskal演算法一致。
**如下:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7view code#define inf 0x7fffffff
8#define len 1010
9using
namespace
std;
1011 typedef struct
point;
1415 typedef struct
arc;
1920
intn, m, top, parent[len];
21point p[len];
22 arc arc[len*len];
23double
map[len][len];
2425 inline double dis(point a, point b)
26bool cmp(arc a, arc b)
27//
ufset
28void init()
29int find(int x)
30void union(int a, int b)
3132
double
solve()
3346}47
for(int i=0; i)54}
55return
ans;56}
5758
intmain()
5967 top = 0;68
for(int i=1; i<=n ;i++)76}
77double ans =solve();
78 printf("
%.2lf\n
", ans);79}
80return0;
81 }
UVA 11228 (Kruskal 最小生成樹)
題目大意 有一系列的點,這些點中假如歐氏距離小於r就認為是同一類,注意a和b同一類,b和c同一類,那麼a和c就是同一類。現在要在點集中鋪路,在一類中我們需要鋪路使得類中的點都連通,在不同類也需要通過路來把它們全部連起來,使得類和類之間能夠互相連線。約束 注意我們總的鋪路的距離要盡可能小。最後輸出鋪路...
UVA 11354 LCA 最小生成樹
點選開啟鏈結 題意 給乙個無向圖,然後有q次詢問u v,問的是u到v的所有路徑中的最小值最大 思路 u到v的路徑最小值最大,則這條邊肯定是最小生成樹上的邊,那麼我們可以先將所有的最小生成樹上的邊全都找出來,然後現在是乙個樹,然後跑一邊lca,對於現在詢問的u到v,只要找到它們的最近公共祖先,然後兩個...
uva1494 最小生成樹 例題
這題說的是n個城市 建路 使他們聯通然後 可以使用一條超級的路這條路不計入總長,此時路長度為b,這條路鏈結的兩個城市人口與和為a b,然後計算出最大的a b 解題先生成一顆最小生成樹,然後 計算出這顆樹上每兩個節點之間要經過的最長的那條路,然後列舉每兩個節點u 個v 求出答案 1 include 2...