C 最小生成樹 HDU 3371

2021-10-03 00:23:23 字數 1663 閱讀 4031

1.題目2.題目大意

某地發洪水,導致某些城市被淹而消失,現在想把剩下的零散的城市通過修路連線起來,已知現在有部分城市是連通的(最後一行輸入就是)。可選擇修的路有m條,城市總共有n個,給出了m條路的起點終點和修路花費,問最少可花多少錢能保證所有的城市連通。

3.解題思路

a.首先是建圖,把每個點到另外乙個點修路所需要的花費給確定,graph[a][b] = graph[b][a] = cost; 然後已經聯通的兩個點花費就為0,無關的點就賦給乙個特定的值。

b.然後用prime求出最少的花費就可以了

4.prime

最小生成樹的prime演算法是以點為核心來進行計算.

原理:從乙個點開始遍歷它到其他所有點的距離,無法直接到達的距離為inf,記錄為mindis陣列

如:一共有四個點abcd 五條邊

a——b 2; a——c 1

; a——d 3

; b——c 4

; c——d 2

;選取a為第乙個點,那麼mindis陣列中的值為0,2

,1,3;並將a標記為已經訪問過的點;

然後從未訪問過的點中找最小的值加入生成樹,即此時mindis陣列的最小值為1

(即a——c的距離最短),為c點,將c加入生成樹(即標記c已經訪問),並將sum加上權值1;

現在生成樹中有兩個點a和c,更新mindis陣列,即看c到各個點的值與原來mindis陣列中的值哪乙個小,此時c——d的權值為2,mindis中到d的權值為3,所以更新mindis,更新後為0,2

,1,2;

重複上述步驟直到訪問所有點

80069746

部落格學習

5.ac**

#include

#include

#include

#include

using

namespace std;

#define maxn 555

#define maxint 1005

int pri[maxn]

[maxn]

, d[maxn]

;int n;

void

prime()

}if(min1 == maxint)

break

; sum+

=min1;

lowcost[minid]=1

;//已經用過了,就標記

for(j =

1; j <=n; j++)}

}if(min1 == maxint)

printf

("-1\n");

else

printf

("%d\n"

,sum);}

intmain()

}for

(int i =

0; i< m; i++)}

for(

int i =

0; i)//已經聯通了的點

}prime()

;}return0;

}

C 最小生成樹

樹是指沒有環路的圖,生成樹就是指乙個圖上面刪除一些邊,使它沒有環路。最小生成樹就是指生成樹中邊權之和最小的那一種。上圖的最小生成樹就是這樣 就以上圖為例 先選擇乙個起始點,我們就以a為例。建立乙個集合s,用來儲存已經在樹中間的點。開始時集合那只有點a,即 s 選擇乙個連通到集合s中乙個點的最小邊,其...

hdu 1863 最小生成樹

使用並查集,陣列不要太小 include stdio.h int set 200 int n,m typedef struct nodenode,pnode node road 200 void init int find int u return set u int join int u,int ...

hdu 4081 最小生成樹

先求出最小生成樹,然後列舉樹上的邊,對於每條邊 分別 找出這條割邊形成的兩個塊中點權最大的兩個 1.由於結果是a b,a的變化會引起b的變化,兩個制約,無法直接貪心出最大的a b,故要通過列舉 2.不管magic road要加在 加的邊是否是最小生成樹上的邊,都會產生環,我們都要選擇一條邊刪掉 注意...