题目地址:http://ac.jobdu.com/problem.php?pid=1024

题目描述:
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
输入:
    测试输入包含若干测试用例。每个测试用例的第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. ?
来源:
2007年浙江大学计算机及软件工程研究生机试真题
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct node{
  5. int start;
  6. int end;
  7. int weight;
  8. }Node;
  9.  
  10. int father[101];
  11. int rank[101];
  12.  
  13. void Make_Set (int M){
  14. int i;
  15. for (i=1; i<=M; ++i){
  16. father[i] = i;
  17. rank[i] = 0;
  18. }
  19. }
  20.  
  21. int Find_Set (int x){
  22. if (x != father[x]){
  23. father[x] = Find_Set (father[x]);
  24. }
  25. return father[x];
  26. }
  27.  
  28. int Union (int x, int y){
  29. x = Find_Set (x);
  30. y = Find_Set (y);
  31.  
  32. if (x == y)
  33. return 0;
  34. if (rank[x] > rank[y]){
  35. father[y] = x;
  36. rank[x] += rank[y];
  37. }
  38. else{
  39. if (rank[x] == rank[y])
  40. ++rank[y];
  41. father[x] = y;
  42. }
  43. return 1;
  44. }
  45.  
  46. int compare (const void * p, const void * q){
  47. Node * p1 = (Node *)p;
  48. Node * q1 = (Node *)q;
  49.  
  50. return p1->weight - q1->weight;
  51. }
  52.  
  53. int main(void){
  54. int N, M;
  55. Node road[5000];
  56. int i;
  57. int cnt;
  58. int ans;
  59.  
  60. while (scanf ("%d%d", &N, &M) != EOF){
  61. if (N == 0)
  62. break;
  63. //scanf ("%d", &M);
  64. for (i=0; i<N; ++i){
  65. scanf ("%d%d%d", &road[i].start, &road[i].end, &road[i].weight);
  66. }
  67. qsort (road, N, sizeof(Node), compare);
  68. Make_Set (M);
  69. ans = 0;
  70. cnt = 0;
  71. for (i=0; i<N; ++i){
  72. if (cnt == M - 1)
  73. break;
  74. if (Union (road[i].start, road[i].end)){
  75. ++cnt;
  76. ans += road[i].weight;
  77. }
  78. }
  79. if (cnt == M - 1){
  80. printf ("%d\n", ans);
  81. }
  82. else{
  83. printf ("?\n");
  84. }
  85. }
  86.  
  87. return 0;
  88. }

九度OJ上相似的题目:http://ac.jobdu.com/problem.php?pid=1347CODE代码片

九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)的更多相关文章

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

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3979 解决:1354 题目描述:     省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有 ...

  2. HDU1232 畅通工程 并查集

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  3. ACM: 继续畅通工程-并查集-最小生成树-解题报告

    继续畅通工程 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Descri ...

  4. ACM: 畅通工程-并查集-解题报告

    畅通工程 Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 某省调查城镇交通状况 ...

  5. B - 畅通工程(并查集)

    对并查集理解之后就可以做这种题了,虽说这种题做的不多,这道题做过才这么快搞定,可是还是挺happy滴,加油 Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接 ...

  6. NSOJ 畅通工程(并查集)

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...

  7. hdu 1233 还是畅通工程 并查集or最小生成树

    某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路 ...

  8. hdu1232 畅通工程 并查集的 应用

    畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. hdu 1863 畅通工程 (并查集+最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    M ...

随机推荐

  1. C++容器类的简介

    C++容器类的简介 一.原型与构造函数 Vector的原型可定义为 vector<T, allocator <T> > 其构造函数为 vector()             ...

  2. [React Native + Firebase] React Native: Real time database with Firebase -- setup & CRUD

    Install: npm i --save firebase // v3.2.1 Config Firebase: First we need to require Firebase: import ...

  3. android学习日记04--开发中的通用细节

    1.android中的计量单位 px (pixels)(像素):是屏幕的物理像素点,与密度相关,密度大了,单位面积上的px会比较多.通常不推荐使用这个 pt(磅):1/72英寸,也较少用 in(英寸) ...

  4. python--字典工厂函数dict()

    dic = {"name" : "wangmo" ,"age" : 18} #dic.clear() #清空字典 print(dic) #{ ...

  5. 简单改写SQL达到优化目的

    select * from (select t.row_id, t.supplier_name, t.tel, address, t.contact, t.contact_post, t.contac ...

  6. Android(java)学习笔记122:TabActivity使用

    1.首先我们要知道TabActivity是结合TabHost使用的,于是我们自然而然要说明一下TabHost 所谓的TabHost是提供选项卡(Tab页)的窗口视图容器. 此对象包含两个子对象: 一个 ...

  7. IIS7下w3wp.exe进程CPU100%问题解决办法

      IIS下经常会出现w3wp.exe进程的CPU使用率达到100%的情况,在IIS7出现之前,要想确定问题所在,可以通过WinDbg来调试分析,但整个过程对技术水平要求非常高,可以参考http:// ...

  8. show variables 详解

    back_log MySQL主线程检查连接并启动一个新线程这段时间内,可以设置多少个请求可以被存在堆栈中 connect_timeout 连接超时 检测方法nmap -p3306 数据库ip dela ...

  9. Nodejs v4.x.0API文档学习(1)简介

    文档参考地址:https://nodejs.org/dist/latest-v4.x/docs/api/ 简介 下面是用nodejs编写的一个web服务的例子,返回"Hello World& ...

  10. Android Studio中文组(中文社区)

    Android Studio中文组(中文社区)http://www.android-studio.org/