题目描述:
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
输入:
    测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M (N, M < =100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
输出:
    对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
样例输入:
  1. 3 3
  2. 1 2 1
  3. 1 3 2
  4. 2 3 4
  5. 1 3
  6. 2 3 2
  7. 0 100
样例输出:
  1. 3
  2. ?
  3.  
  4. 这道题是九度oj1012的升级版,考察了并查集和最小生成树。此处最小生成树采用了prim算法,使用了数组lowCost来记录与当前包括点集的点的最近距离,通过加入n个点来解决问题。
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <string>
  5. #define MAX 102
  6. #define inf 0x3f3f3f3f
  7. int next[MAX];
  8. int flag[MAX];
  9. int cost[MAX][MAX];
  10. int lowCost[MAX];
  11.  
  12. int find(int x) {
  13. while(next[x] != ) {
  14. x = next[x];
  15. }
  16. return x;
  17. }
  18.  
  19. int main(int argc, char const *argv[])
  20. {
  21. int n,m;
  22. scanf("%d",&n);
  23. while(n != ) {
  24. int count = ;
  25. scanf("%d",&m);
  26. for(int i = ; i <= m; i++) {
  27. next[i] = ;
  28. flag[i] = ;
  29. for(int j = ; j <= m; j++) {
  30. cost[i][j] = inf;
  31. }
  32. }
  33. for(int i = ; i < n; i++) {
  34. int a,b,c;
  35. scanf("%d %d %d",&a,&b,&c);
  36. int fa = find(a);
  37. int fb = find(b);
  38. if(fa != fb) {
  39. next[fa] = fb;
  40. }
  41. if(c < cost[a][b])
  42. cost[a][b]= cost[b][a] = c;
  43. }
  44. for(int i = ; i <= m; i++) {
  45. //printf("%d\t",next[i]);
  46. if(next[i]== ) count++;
  47. }
  48. //printf("\n");
  49. if(count - != ) {
  50. printf("?\n");
  51. }
  52. else {
  53.  
  54. int sumCost = ;
  55. for(int i = ; i <= m; i++) {
  56. lowCost[i] = cost[][i];
  57. }
  58. flag[] = ;
  59.  
  60. for(int i = ; i <= m; i++) {
  61. int min = inf;
  62. int v = -;
  63. for(int i = ; i <= m; i++) {
  64. if(flag[i] == && lowCost[i] < min) {
  65. min = lowCost[i];
  66. v = i;
  67. }
  68. }
  69. flag[v] = ;
  70. sumCost = sumCost + lowCost[v];
  71.  
  72. for(int i = ; i <= m; i++) {
  73. if(cost[v][i] < lowCost[i]) {
  74. lowCost[i] = cost[v][i];
  75. }
  76. }
  77. }
  78.  
  79. printf("%d\n",sumCost);
  80. }
  81.  
  82. scanf("%d",&n);
  83. }
  84.  
  85. return ;
  86. }

第一次提交wrong answer, 之后在41行加了一句话,if(c < cost[a][b]) , 这说明两个城市之间可以不仅有一条路。

九度oj 题目1024:畅通工程的更多相关文章

  1. 九度OJ 1017 还是畅通工程

    #include <iostream> #include <string.h> #include <sstream> #include <math.h> ...

  2. 九度OJ 1012:畅通工程 (最小生成树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:7052 解决:3034 题目描述: 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工 ...

  3. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  4. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  6. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  7. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  8. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  9. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

随机推荐

  1. 安装ubuntu虚拟环境

    一. 安装 1. 准备: 1). Oracle VM VirtualBox https://www.virtualbox.org/ 2). Ubuntu 18.04.2 LTS https://ubu ...

  2. Sass基本特性

    Sass扩展/继承@extend 代码的继承,声明方式:.class;调用方式:@extend 如: .btn { border: 1px solid #ccc; padding: 6px 10px; ...

  3. arcgis jsapi接口入门系列(5):几何(点线面)基本操作

    点 point: function () { //通过wkt生成点 //wkt,代表点的坐标 let wkt = "POINT(113.566806 22.22445)"; //w ...

  4. gcc&g++

    原文章 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为.cpp的,两者都会认为是c++程序,注 ...

  5. spark基准测试-BigDataBenchs

    https://blog.csdn.net/haoxiaoyan/article/details/53895068

  6. Spring MVC系列[2]——参数传递及重定向

    1.目录结构 2.代码 <?xml version="1.0" encoding="UTF-8"?> <web-app version=&qu ...

  7. sql server 2008怎么设置不允许windows身份验证

  8. Win7下vc++6.0打开项目出现问题的解决方案

    Win7下vc++6.0打开项目出现Microsoft(R) Developer Studio以及Unable to register this add-in because its DLLRegis ...

  9. UIButton 左对齐 省略号最右边

    //左对齐 [_btn setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft]; //省略号靠右侧 _btn.ti ...

  10. SpringAOP 设计原理

    1.  设计原理 引入了,代理模式. java 程序执行流: 如果从虚拟机的角度看,整个程序的过程就是方法的调用,我们按照方法的执行顺序,将方法调用成一串. 在方法之间有着Join Point 连接点 ...