HDU 1879 繼續暢通工程 最小生成樹

2022-08-31 03:36:12 字數 2024 閱讀 3661

思路:

比較典型的求最小生成樹,利用k演算法或者p演算法,如果在輸入時兩個村莊的修建狀態為 已修建,那麼我這裡的做法是讓他們之間的權值為 0,即修建費用為 0;然後套用演算法就好了。

**p演算法

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 

12using

namespace

std;

13/*

集合之里:屬於mst所構成的點集 反之亦然

*/14

const

int maxn = 103;15

const

int inf = 0x3f3f3f3f; //

最大值16

int edge[maxn][maxn]; //

鄰接矩陣

17int used[maxn]; //

標記這個點是否在最小生成樹的集合裡面 0 代表未加入 1 代表加入

18int lowcost[maxn]; //

存放的是未被加入集合的 點 到 已經被加入集合的 點 的最短距離(如果集合裡面的點和 多個集合之外的點相通 就取短的那個 這個陣列伴隨著加入點的變化而時刻變化著)

19int

n;20

21int prim(int start,int maxn) //

假設 從 start 開始尋找mst, maxn 代表點的個數

2228

int sumweight = 0; //

mst 的權值

2930

for(int i = 1; i <= maxn; i++)

3141}42

if(v != -1) //

找到了 v 這個點

4352}53

}54}55

return

sumweight;56}

5758

intmain()

5973 cout << prim(1, n) <75return0;

76 }

**k演算法:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 

12using

namespace

std;

1314

const

int maxn = 2e3+ 3;15

intpre[maxn];

16int

n;17

18int find(int

x)19

2223

structnode

24cy[103 * 103

];27

28int

mycmp(nodea,nodeb)

2932

33void

mst()

3438

39int

kru()

4051}52

return

ans;53}

5455

intmain()

5668 sort(cy + 1, cy + n * (n - 1) / 2 + 1

, mycmp);

69int ans =kru();

70 printf("

%d\n

",ans);71}

72return0;

73 }

繼續暢通工程 hdu 1879

include 2243673 2010 03 24 20 56 41 accepted 1879 375ms 320k 1070 b c 悔惜晟 include 修改了三次終於ac,為何就是 的效率不高 include include using namespace std int s 4991 ...

hdu 1879 繼續暢通工程

include include include typedef structedge edge input 5050 int cost 5050 int parent 5050 int cmp const void a,const void b int root int n int kruskal ...

HDU 1879 繼續暢通工程

和前幾個最小生成樹有點不一樣的地方就是 在kruskal裡面,要先把已經修通的路排在前面 不知道這樣是不是多此一舉呢 再按照每條路的價值從小到大排序 自定義排序規則就是 呼叫c 的sort int cmp const e a,const e b 將每條邊存在結構體edge裡面 struct e ed...