2020.10.16第二次每日一題
要讓所有的村莊連在一起,並且花費最小,標準的最小生成樹問題
什麼是最小生成樹呢?網上搜都能搜到。常用的最小生成樹演算法一般是兩個:
1.prim演算法:不斷加點的方式;2.kruskal演算法:不斷加邊的方式,這裡先給出kruskal的演算法。
首先就是存點和邊,然後我們使用到的陣列盡量在主函式外面開,在裡面開直接mle了
const
int max =
1005
;int a[max]
, parent[max]
;int n;
struct edge
edges[max *
(max -1)
/2];
struct node
node[max]
;
然後定義的是邊權值是如何計算的,還有並查集的三個函式
//計算邊的權值
double
cost
(node a,node b)
int
get_root
(int a)
return parent[a];}
void
merge
(int a,
int b)
bool
query
(int a,
int b)
接下來是主函式
int
main()
for(
int i =
0; i < n; i++)}
sort
(edges, edges + num)
;double sum =
0.0;
int count=0;
for(
int k =
0; k < num; k++
) */
int start = edges[k]
.start;
int end = edges[k]
.end;if(
get_root
(start)
!=get_root
(end))}
} cout<<
setiosflags
(ios::fixed)
<<
setprecision(2
)<
//c++中的保留小數的輸出函式
return0;
}
感覺很好啊,功能都實現了,應該可以一次性通過啊,結果經歷了漫長的修改之路
開始報錯是,sort函式使用錯誤,因為我們是對結構體陣列進行排序,所以要自己寫乙個比較的函式,告訴電腦該如何去排序
bool
cmp(edge a,edge b)
//主函式裡也需要修改
sort
(edges, edges + num , cmp)
;
發現還是不對哇,發現如果用函式去呼叫會發生爆棧,直接 mle了,只好去主函式裡修改了一下,怎麼辦呢?我們就不呼叫那幾個函式了,直接用語句去替換
if
(get_root
(start)
!=get_root
(end)
)}
結果發現還是不太對,搞死搞不出來,結果竟然是14,樣例都不對
從頭到尾檢查一遍,發現原來困擾了1個小時的問題竟然是這裡
double
cost
(node a,node b)
好吧,我盡力了,這就是刷題的快樂,成功的那一刻喜悅之情是溢於言表的、
#include
#include
#include
#include
#include
using
namespace std;
const
int max =
1005
;int a[max]
, parent[max]
;int n;
struct edge
edges[max *
(max -1)
/2];
struct node
node[max]
;double
cost
(node a,node b)
void
initial
(int n)
}int
get_root
(int a)
return parent[a];}
void
merge
(int a,
int b)
bool
query
(int a,
int b)
bool
cmp(edge a,edge b)
intmain()
for(
int i =
0; i < n; i++)}
sort
(edges, edges + num ,cmp)
;double sum =
0.0;
int count=0;
for(
int k =
0; k < num; k++
) */
int start = edges[k]
.start;
int end = edges[k]
.end;if(
get_root
(start)
!=get_root
(end))}
} cout<<
setiosflags
(ios::fixed)
<<
setprecision(2
)<
return0;
}
昨天去紫金山實習去了,今天繼續補題了…
近期預告:
線段樹、樹狀陣列、狀壓dp、trie樹、圖論
每日一題 建立聯絡 最小生成樹
最小生成樹,語文閱讀能力的水平首先,題目中給的 k 並不是要我們去從所有的關係中找 k 個人,而是告訴我們 現在已經有 k 個人組成一團了,那麼還有幾個人孤苦伶仃呢?當然是 n k 個 人了,假設 原先的那 k 個人就是乙個整體,那麼現在要將這 n k 個人和 k 組成乙個大的整體 請仔細閱讀最後的...
最小生成樹一 Prim演算法 (模板題)
描述 但是,問題也接踵而來 小hi現在手上擁有n座城市,且已知這n座城市中任意兩座城市之間建造道路所需要的費用,小hi希望知道,最少花費多少就可以使得任意兩座城市都可以通過所建造的道路互相到達 假設有a b c三座城市,只需要在ab之間和bc之間建造道路,那麼ac之間也是可以通過這兩條道路連通的 小...
最小生成樹演算法
由帶權的連通圖生成的數的各邊加起來稱為生成樹的權,把權值最小的生成樹稱為最小生成樹 minimum spanning tree 簡稱為mst 構造最小生成樹的方法就是利用mst性質,一條一條地選擇可以加入的邊。下面介紹兩種用於構造最小生成樹的演算法,其中第一種演算法稱為prim演算法,第二種演算法稱...