程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> HDU 1233 還是暢通工程

HDU 1233 還是暢通工程

編輯:關於C語言

題目意思就是給你一個有n個點的圖,給出n *(n-1)/ 2 條邊的信息,包括邊的端點和邊的長度,要求
在滿足所有點在同一個連通分支上的前提下,選擇最短的道路來修建。典型的最小生成樹算法,同樣,問題
規模不大,直接矩陣就可以勝任。  1 #include<stdlib.h>
 2 #include<stdio.h>
 3 #include<string.h>
 4
 5 const int MAX = 100000000;
 6 int map[101][101], MIN, sum;
 7 // map[i][j] 記錄從點 i 到點 j 的距離 !
 8
 9 int main()
10 {
11     int n, x, y, m, v[101], flag, dis;
12     while (scanf("%d", &n), n)
13     {
14           map[n][n];
15           memset(map, 0, sizeof(map));//數組清零
16           m = (n*(n-1))/2;
17           for (int i=0; i<m; i++)
18           { //輸入並處理邊的信息
19               scanf("%d %d %d", &x, &y, &dis);
20              map[x-1][y-1] = map[y-1][x-1] = dis;
21           }
22           for (int i=0; i<n; i++)map[i][i] = MAX;
23           //建圖完成 !
24           v[n];
25           memset(v, 0, sizeof(v));
26           v[0] = 1;
27           sum = 0;
28           for (int i=1; i<n; i++)
29           {//prim 算法求最小生成樹
30               MIN = 10000000;
31               for (int j=0; j<n; j++)
32               {
33                   if (!v[j] && map[0][j] < MIN)
34                   {
35                      MIN = map[0][j];
36                      flag = j;
37                   }
38               }
39               sum += MIN;
40               v[flag] = 1;
41               for (int j=0; j<n; j++)
42               {
43                   if (!v[j] && map[0][j] > map[flag][j])
44                   {
45                      map[0][j] = map[flag][j];
46                   }
47               }
48           }
49           printf("%d\n",sum);
50     }
51     return 0;
52 }
53
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved