当前位置:编程学习 > C/C++ >>

HDU 1233 还是畅通工程

题目意思就是给你一个有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
 

补充:软件开发 , C语言 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,