昨晚被最小生成樹的題卡了一晚上,好不容易才搞明白
就以這道題為例吧
線路規劃
題目我放到最後
最小生成樹有兩種演算法kruskal和prim
兩種演算法其實都是貪心
還是蒟蒻的我現在還只會kruskal演算法
就只寫這一種演算法了
最小生成樹有兩個性質
kruskal演算法:
1. 快排邊長,用貪心的思想每次都優先選取權值較小的邊
2. 建立並查集,判斷是否連成環。如果兩個點已經在乙個並查集裡面,若連線,就會形成乙個環
3. 當邊的數量為點的數量減一時,最小生成樹已經建成了,退出迴圈
蒟蒻好不容易通過的**
int f[
101011];
//並查集
int n,m,cnt;
ll ans;
struct node
a[101011];
intfind
(int root)
//找根節點
return root;
}bool
cmp(node t1,node t2)
void
kruskal()
ans +
= a[i]
.val;
f[root1]
= root2;
//合併為乙個並查集if(
++cnt == n-1)
break
;//迴圈結束條件:邊的數量為點的數量減一 }}
intmain()
for(
int i=
0;i)sort
(a,a+m,cmp)
;kruskal()
; cout << ans << endl;
return0;
}
問題 a: 線路規劃
時間限制: 1 sec 記憶體限制: 128 mb
題目描述
有n 個村莊之間需要架設通訊線路,使得任意兩個村莊之間均可通訊。兩個村莊a, b 間可通訊,當且僅當它們之間存在一條通訊線路或者存在村莊c 使得a,c 和b,c 間均可通訊。給出村莊之間架設通訊線路的代價,求出最小的總代價。
輸入第一行包含兩個整數n,m,分別表示村莊數量和可以架設通訊線路的村莊對數。以下m 行,每行三個整數a,b,c,表示村莊a,b之間架設線路的代價為c(村莊從0 開始編號)。
輸出乙個整數,最小總代價。
樣例輸入 copy
3 30 1 1
1 2 1
2 0 3
樣例輸出 copy2提示
對於50% 的資料,n<=100,m <=n^2
對於全部資料,1<=n<=10^5; n-1<=m<=10^5,所有代價均在[0, 10^6] 範圍內,保證問題有解。
最小生成樹 kruskal(演算法)
最小生成樹 圖中有好多點呀 n個 讓我們找到n 1條邊,來把他們連上吧,但是要讓這n 1條邊的和最小。kruskal演算法 把所有邊由公升序排列,然後從最小的一條邊找起,如果這條邊的兩點不屬於乙個集合 此處運用並查集 那麼就要這條邊,否則,忽略這條邊吧 一直這樣找下去,直到找了n 1條邊為止,此時,...
最小生成樹 Kruskal演算法
1.概覽 kruskal演算法是一種用來尋找最小生成樹的演算法,由joseph kruskal在1956年發表。用來解決同樣問題的還有prim演算法和boruvka演算法等。三種演算法都是貪婪演算法的應用。和boruvka演算法不同的地方是,kruskal演算法在圖中存在相同權值的邊時也有效。2.演...
最小生成樹 kruskal演算法
2016.12.30 演算法思想 先將邊按照權值排序,從權值最小的邊開始列舉,如果當前邊連線的兩個點不屬於同一集合,就將這兩個點連起來 用到的資料結構是並查集 一直到列舉完所有的邊,此時生成的就是最小生成樹 include include include include using namespac...