posts - 99,  comments - 8,  trackbacks - 0
和 1102 完全一个类型的,只是调用几个数学函数求距离
 1
 2#include <stdio.h>
 3#include <stdlib.h>
 4#include <string.h>
 5
 6int main ()
 7{
 8    int n, q, a, b;
 9    int lowcost[101];               //开始时储存源点到其他各顶点的边值,随后根据加进来的顶点,不断改变所存的边值 
10    int edge[101][101];             //存输入的边之间的长度 
11    int visit[101];                 //标志顶点是否已经加入 
12    
13    while ( scanf ("%d"&n)!= EOF )
14    {
15           memset (visit, 0sizeof (visit)); 
16           memset (lowcost, 0sizeof (lowcost));                                                                      
17           
18          //输入处理 
19          for (int i = 1; i <= n; i ++)
20          {
21              for (int j = 1; j<= n; j ++)
22              {
23                  scanf ("%d"&edge[i][j]);
24              }

25          }

26          scanf ("%d"&q);
27          if ( q )
28          {
29               for (int i = 0; i < q; i ++)  //本身存在边则该顶点被标记 
30               {
31                   scanf ("%d %d"&a, &b);
32                   edge[a][b] = edge[b][a] = 0
33               }

34          }

35          
36          //prime:每次都从剩下的边中选出最短的一条,标记相关的顶点,并且修改相关边的值 
37          //对lowcost 进行初始化处理
38          for (int i = 1; i <= n; i ++ )
39          {
40              lowcost[i] = edge[1][i];
41          }
 
42          
43          int sum = 0;  
44          int k;        
45          for (int i = 1; i <= n; i ++)
46          {            
47              int max = 10000;
48
49              for ( int i = 1; i <= n; i ++ )
50              {
51                  if ( lowcost[i] < max && !visit[i] ) 
52                  {
53                     max = lowcost[i];
54                     k = i;
55                  }
                                                                             
56              }

57              
58              if (max == 10000)  //如果没有找到最小的边一下一个顶点作为起点  ,这就是和找最短路径不同的地方                  
59              break;
60              
61              visit[k] = 1;
62              sum += lowcost[k];
63              
64              for (int i = 1; i <= n; i ++)
65              {
66                  if ( !visit[i] && lowcost[i] > edge[k][i])  //新引入的顶点到其他顶点的边值  是否 小于  原来的边值 
67                  {
68                       lowcost[i] = edge[k][i]; 
69                  }
 
70              }

71          }
          
72          printf ("%d\n", sum);
73    }

74   // system ("pause");
75    return 0;
76}
 
77
posted on 2010-08-23 15:35 雪黛依梦 阅读(423) 评论(0)  编辑 收藏 引用 所属分类: 最小生成树

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


<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(4)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜