HDU1879(最小生成树)

解题思路:题意明确,其实是最小生成树的一种变形, 可以在读取输入时将已经建设的道路的费用看做是0,然后直接寻找最小生成树,得到生成树的耗费就是最短耗费。另外注意:用cin、cout输入输出则会超时,本来以为数据量不会太大,但改用scanf和printf后就AC了。
ExpandedBlockStart.gif View Code
 1 #include<stdio.h>
 2  #define MAX 0xfffffff
 3  #define max 105
 4 
 5  int map[max][max],sign[max];
 6  int main()
 7 {
 8      int n,a,b,c,d,i,j;
 9      while(scanf( " %d ",&n)&&n)
10     {
11          for(i= 1;i<=n;i++)
12         {
13             sign[i]= 0;
14              for(j= 1;j<=n;j++)
15                 map[i][j]=MAX;
16         } 
17          for(i= 1;i<=n*(n- 1)/ 2;i++)
18         {
19             scanf( " %d%d%d%d ",&a,&b,&c,&d);
20              if(d== 1) map[a][b]=map[b][a]= 0;
21              else map[a][b]=map[b][a]=c;
22         }
23          int sum= 0,min,u;
24          for(i= 1;i<=n;i++)
25         {
26             sign[ 1]= 1;
27             min=MAX;
28              for(j= 1;j<=n;j++)
29                  if(!sign[j]&&min>map[ 1][j])
30                 {
31                     min=map[ 1][j];
32                     u=j;
33                 }
34                 sign[u]= 1;
35                  if(min!=MAX) sum+=min;
36                  for(j= 1;j<=n;j++)
37                      if(map[u][j]<map[ 1][j])
38                         map[ 1][j]=map[u][j];
39         }
40         printf( " %d\n ",sum);
41     }
42      return  0;
43 }

转载于:https://www.cnblogs.com/yueshuqiao/archive/2012/02/18/2357539.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值