HDU 1102 Constructing Roads

HDU 1102 Constructing Roads

这个题目的意思就是说,给你一个有n个村庄的地图,map[i][j]表示从村庄 i 到村庄 j 的距离,然后给你
m 条已有道路,让你在这个基础上添加适当的道路,使得所有村庄之间都是联通的,求添加道路的最短距
离的值。 典型的最小生成树算法的运用。
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 
 5 const int MAX = 0x7fffffff
 6 int map[101][101], v[101], x, y, n, sum, flag, min;
 7 
 8 void Reset(int n)
 9 {//根据 规模  n 的大小  ,建立 map! 
10      for (int i=0; i<n; i++)
11      {
12          for (int j=0; j<n; j++)
13          {
14              scanf("%d"&map[i][j]);
15              if (i == j)map[i][j] = 0;
16          }
17      }
18      int m;
19      scanf("%d"&m);
20      for (int i=0; i<m; i++)
21      {
22          scanf("%d %d"&x, &y);
23          map[x-1][y-1= map[y-1][x-1= 0;
24      }
25 }
26 void MinTree()
27 {// 最小生成树算法 
28      memset(v, 0sizeof(v));
29      v[0= 1;
30      sum = 0;
31      for (int i=1; i<n; i++)
32      {
33          min = MAX;
34          for (int j=0; j<n; j++)
35          {
36              if (!v[j] && map[0][j] < min) 
37              {
38                 min = map[0][j], flag = j;
39              }
40          }
41          v[flag] = 1;
42          sum += min;
43          for (int j=0; j<n; j++)
44          {
45              if (!v[j] && map[0][j] > map[flag][j])
46              {
47                 map[0][j] = map[flag][j];
48              }
49          }
50      }
51      printf("%d\n", sum);
52 }
53 
54 int main()
55 {
56     while (scanf("%d"&n) != EOF)
57     {
58           Reset(n);
59           MinTree();
60     }
61     return 0;
62 }





posted on 2011-07-18 08:34 AK 阅读(1577) 评论(0)  编辑 收藏 引用 所属分类: 最小生成树和并查集


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

资源连接

搜索

最新评论

阅读排行榜

评论排行榜