鏢局運鏢(最小生成樹 Kruskal)

2021-09-12 11:58:20 字數 1972 閱讀 4293

7-11 鏢局運鏢 (30 分)

鏢局的運鏢,就是運貨(類似現在的物流)。鏢局每到乙個新地方開展業務,都需要對運鏢途中的綠林好漢進行打點。好說話的打點費就比較低,不好說話的打點費就比較高。龍門鏢局現在有一趟鏢請你來規劃路線,已知城市的地圖,你需要選擇一些道路進行疏通,以便鏢局可以到達任意乙個城市,要求花費的銀子越少越好。

第一行有兩個數n和m,n表示有n個城市(編號從1到n),m表示有m條道路。接下來m行,每行形如「a b c」用來表示一條道路,意思是城市a到城市b連通且打點需要花費的銀子數是c。

若通過打點能抵達所有城市,則輸出最少需要花費的銀子總數。若不能抵達所有的城市則輸出「impossible」。

3 3

1 2 1

1 3 2

2 3 4

3
題目大意:乙個無向圖有n個點,給你m條線段資訊,表示兩點之間的距離。現在求最小的路徑總長度,將這n個點連成乙個連通圖,其實就是求最小生成樹。

最小生成樹有兩種演算法:kruskal和prim演算法。兩種方法求出來的結果一定都是最小生成樹(最小生成樹可能不唯一,但是最短總路徑一定一樣的),但是兩種方法思路不一樣,使用場合也不同。 

kruskal是不斷地在找最小邊,prim是找距離生成樹權值最小的點。kruskal主要找邊,prim主要找點,這就決定了當邊少的時候,就用kruskal;當點少的時候,就用prim。專業的說,kruskal適合稀疏圖,prim適合稠密圖。

(如果想達到最佳時間,其實應該兩種方法都用,先判斷一下給出的是稀疏圖還是稠密圖。忘了在**看到的)

kruskal思想很簡單,就是將邊從小到大排序,從小的開始找,如果這條邊的兩個點不在一棵樹上,那麼將這兩個點連線起來;如果兩個點在一棵樹上,跳過,繼續找下乙個邊......重複進行,直到增加的邊的數量達到n-1條。因為n個點的最小生成樹的線段一定有n-1個邊。

在判斷是否是一棵樹上的時候,用到了並查集。寫這道題的時候,將union函式中的f[a]=b寫成了a=f[b],debug的時候還在奇怪我的並查集怎麼沒有用??還是對並查集理解不夠熟練吧。

並查集的核心

int find(int x)

void union(int x,int y)

for(int i=1;i<=n;i++) //初始化f陣列

f[i]=i;

這道題可能搜不到,但是網上有很多題目描述不一樣,但是實質是一樣的題目。這題是天梯賽學校選拔時候出的,我當時學會了dijstra演算法,想著和prim差不多,應該可以現場寫出來(我對prim和kruskal僅限於理解含義,**從沒寫過)。浪費了30分鐘在這道題上,這次讓我下定決心把圖論學到紮實,做到遇到圖論可以有思路,不浪費時間地解決問題。

#include #include #include using namespace std;

const int max = 1000010;

int f[max];

int n,m,x,y;

int find(int x)

void union(int x,int y)

struct node

;node a[max];

bool cmp(node a,node b)

sort(a,a+m,cmp);//按路徑長度從小到大排序

int sum=0,t=0;//sum為最小路徑總和,t為已經新增了的路徑條數

for(int i=0;i>n>>m;

kruskal();

return 0;

}

網上找的其他比較複雜的測試用例

6 10

1 2 16

1 6 21

1 5 19

2 3 5

2 4 6

2 6 11

3 4 6

6 4 14

5 4 18

5 6 33

答案:56

啊哈演算法 鏢局運鏢(最小生成樹)

最近小哼迷上了 龍門鏢局 從恰克圖道武夷山,從張家口道老河口,從迪化道佛山,從蒙自道奉天.古代鏢局的運鏢,也就是現在的物流。鏢局每到乙個地方開展業務,都需要堆運鏢途中的綠林好漢進行打點 不給錢就不讓過路 好說話的打點費就比較低,不好說話的打點費就比較高。城鎮類似如下,頂點是城鎮編號,邊上的值表示這條...

7 4 龍門鏢局(最小生成樹)

龍門鏢局專門負責為客人運送貨物,從恰克圖到武夷山,從張家口到老河口,從迪化到佛山,從蒙自到奉天,迤邐數千里的商道上,或車馬,或舟楫,或駝馱,或肩挑,貨物往來,錢財遞送。商號開在 鏢局便設在 鏢局每到乙個新地方開展業務,都需要對運鏢途中的綠林好漢進行打點。好說話的打點費就比較低,不好說話的打點費就比較...

soj 3366 複習最小生成樹kruskal

題目大意 要建井,每個地方都要有,可以選擇直接在這裡挖井,也可以選擇從其他地方已經有井的地方建一條路到這個地方來。有一段時間沒有寫過最小生成樹了,感覺都有一點快要忘記了的感覺。這道題之前沒有過,借鑑了一下別人的思想。發現真的好簡單。而且這種方法在以前使用過,這回居然沒有想出來,要反思一下了。感覺跟之...