1. 程式人生 > >hdu 1233 還是暢通工程 (prim)

hdu 1233 還是暢通工程 (prim)

its accep class limit input cli can climits sam

還是暢通工程
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 58241 Accepted Submission(s): 26468
Problem Description
某省調查鄉村交通狀況,得到的統計表中列出了任意兩村莊間的距離。省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通(但不一定有直接的公路相連,只要能間接通過公路可達即可),並要求鋪設的公路總長度為最小。請計算最小的公路總長度。
Input
測試輸入包含若幹測試用例。每個測試用例的第1行給出村莊數目N ( < 100 );隨後的N(N-1)/2行對應村莊間的距離,每行給出一對正整數,分別是兩個村莊的編號,以及此兩村莊間的距離。為簡單起見,村莊從1到N編號。
當N為0時,輸入結束,該用例不被處理。
Output
對每個測試用例,在1行裏輸出最小的公路總長度。
Sample Input
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
Sample Output
3
5 Hint
Hint

Huge input, scanf is recommended.

C/C++:

 1 #include <cstdio>
 2 #include <climits>
 3 using namespace std;
 4 
 5 int n, my_map[110][110];
 6 
 7 int my_prim()
 8 {
 9     int my_pos = 1, my_book[110] = {0, 1}, my_dis[110] = {0, INT_MAX}, my_ans = 0;
10     for (int i = 2; i <= n; ++ i)
11         my_dis[i] = my_map[my_pos][i];
12
for (int i = 1; i < n; ++ i) 13 { 14 int my_temp = INT_MAX; 15 for (int j = 1; j <= n; ++ j) 16 { 17 if (!my_book[j] && my_dis[j] < my_temp) 18 { 19 my_temp = my_dis[j]; 20 my_pos = j; 21 }
22 } 23 my_ans += my_temp; 24 my_book[my_pos] = 1; 25 for (int j = 1; j <= n; ++ j) 26 if (my_dis[j] > my_map[j][my_pos]) 27 my_dis[j] = my_map[j][my_pos]; 28 } 29 return my_ans; 30 } 31 32 int main() 33 { 34 while (scanf("%d", &n), n) 35 { 36 int my_line = n * (n-1) / 2; 37 for (int i = 0; i < my_line; ++ i) 38 { 39 int a, b, a_b_dis; 40 scanf("%d%d%d", &a, &b, &a_b_dis); 41 my_map[a][b] = my_map[b][a] = a_b_dis; 42 } 43 printf("%d\n", my_prim()); 44 } 45 return 0; 46 }

hdu 1233 還是暢通工程 (prim)