暢通工程 最小生成樹prim

2022-09-13 12:18:10 字數 1673 閱讀 3214

題目:

暢通工程

time limit: 1000/1000 ms (j**a/others)    memory limit: 32768/32768 k (j**a/others)

total submission(s): 36652    accepted submission(s): 16298

problem description

省**「暢通工程」的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可)。經過調查評估,得到的統計表中列出了有可能建設公路的若干條道路的成本。現請你編寫程式,計算出全省暢通需要的最低成本。

input

測試輸入包含若干測試用例。每個測試用例的第1行給出評估的道路條數 n、村莊數目m ( < 100 );隨後的 n

行對應村莊間道路的成本,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間道路的成本(也是正整數)。為簡單起見,村莊從1到m編號。當n為0時,全部輸入結束,相應的結果不要輸出。

output

對每個測試用例,在1行裡輸出全省暢通需要的最低成本。若統計資料不足以保證暢通,則輸出「?」。

sample input

3 31 2 1

1 3 2

2 3 4

1 32 3 2

0 100

sample output3?

思路:**:

#include #include 

#include

using

namespace

std;

const

int size = 100 + 1

;const

int max = 0x3f3f3f3f

;struct

edge

};vector

graph[size];

intminfee[size];

bool

marked[size];

int count = 1

;int ans = 0

;bool prim(int x, int

m)

int min =max;

intindex;

for(int i = 1; i <= m; i++)//

找當前最小費用及其下標

}if(min == max)//

若未找到最短路,則不連通

return

false

;

//新增當前最短路

marked[index] = true

; count++;

ans+=min;

prim(index, m);

}int

main()

for(int i = 0; i < size; i++)

graph[i].clear();

//輸入

for(int i = 0; i < n; i++)

if(prim(1

, m))

printf(

"%d\n

", ans);

else

printf(

"?\n");

}return0;

}

還是暢通工程 最小生成樹 Prim演算法

includeusing namespace std 測試輸入包含若干測試用例。每個測試用例的第1行給出村莊數目n 100 隨後的n n 1 2行對應村莊間的距離,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間的距離。為簡單起見,村莊從1到n編號。當n為0時,輸入結束,該用例不被處理。in...

暢通工程(最小生成樹)

首先要判斷能否構成生成樹,剛開始的思路是用hash遍歷城市,看是否所有的城市都記錄進取,被測試資料誤導,如果給這組資料 1,2 3,4 這麼沒辦法構成單樹。include include const int inf 0x7fffffff const int maxn 110 int hash max...

還是暢通工程 最小生成樹

題目描述 某省調查鄉村交通狀況,得到的統計表中列出了任意兩村莊間的距離。省 暢通工程 的目標是使全省任何兩個村莊間都可以實現公路交通 但不一定有直接的公路相連,只要能間接通過公路可達即可 並要求鋪設的公路總長度為最小。請計算最小的公路總長度。輸入 測試輸入包含若干測試用例。每個測試用例的第1行給出村...