时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:3140

解决:1338

题目描述:
    省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
输入:
    测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( 1< N < 100 );随后的 N(N-1)/2 行对应村庄间道路的成本及修建状态,每行给4个正整数,分别是两个村庄的编号(从1编号到N),此两村庄间道路的成本,以及修建状态:1表示已建,0表示未建。



    当N为0时输入结束。
输出:
    每个测试用例的输出占一行,输出全省畅通需要的最低成本。
样例输入:
  1. 3
  2. 1 2 1 0
  3. 1 3 2 0
  4. 2 3 4 0
  5. 3
  6. 1 2 1 0
  7. 1 3 2 0
  8. 2 3 4 1
  9. 3
  10. 1 2 1 0
  11. 1 3 2 1
  12. 2 3 4 1
  13. 0
样例输出:
  1. 3
  2. 1
  3. 0
来源:
2008年浙江大学计算机及软件工程研究生机试真题

思路:

采用并查集求解。

对道路排序时,第一排序原则是道路是否已经修好,修好的排在前面,第二排序原则是道路的成本。

先计算已经修好的道路的连通性,然后逐个添加维修好的道路,添加过程中记录新增道路的成本。最后的总成本就是答案。

代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define N 100
  5. #define M (N*(N-1)/2)
  6.  
  7. typedef struct node {
  8. int x;
  9. int y;
  10. int d;
  11. int s;
  12. } ROAD;
  13.  
  14. int n;
  15. int pre[N+1];
  16. int count[N+1];
  17. int num;
  18.  
  19. void init()
  20. {
  21. for (int i=1; i<=n; i++)
  22. {
  23. pre[i] = i;
  24. count[i] = 1;
  25. }
  26. num = n;
  27. }
  28.  
  29. int find(int i)
  30. {
  31. while (i != pre[i])
  32. i = pre[i];
  33. return i;
  34. }
  35.  
  36. int combine(int i, int j)
  37. {
  38. int a = find(i);
  39. int b = find(j);
  40. if (a != b)
  41. {
  42. if (count[a] > count[b])
  43. {
  44. pre[b] = a;
  45. count[a] += count[b];
  46. count[b] = 0;
  47. }
  48. else
  49. {
  50. pre[a] = b;
  51. count[b] += count[a];
  52. count[a] = 0;
  53. }
  54. num --;
  55. return 1;
  56. }
  57. else
  58. return 0;
  59. }
  60.  
  61. int cmp(const void *a, const void *b)
  62. {
  63. ROAD *x = (ROAD *)a;
  64. ROAD *y = (ROAD *)b;
  65. if (x->s != y->s)
  66. return y->s - x->s;
  67. else
  68. return x->d - y->d;
  69. }
  70.  
  71. int main(void)
  72. {
  73. int m, i;
  74. ROAD r[M];
  75. int sum;
  76.  
  77. while (scanf("%d", &n) != EOF && n)
  78. {
  79. m = n*(n-1)/2;
  80. for(i=0; i<m; i++)
  81. scanf("%d%d%d%d", &r[i].x, &r[i].y, &r[i].d, &r[i].s);
  82. qsort(r, m, sizeof(r[0]), cmp);
  83.  
  84. init();
  85. sum = 0;
  86. for(i=0; i<m; i++)
  87. {
  88. if(combine(r[i].x, r[i].y) && r[i].s == 0)
  89. sum += r[i].d;
  90. if (num == 1)
  91. break;
  92. }
  93.  
  94. printf("%d\n", sum);
  95. }
  96.  
  97. return 0;
  98. }
  99. /**************************************************************
  100. Problem: 1028
  101. User: liangrx06
  102. Language: C
  103. Result: Accepted
  104. Time:20 ms
  105. Memory:928 kb
  106. ****************************************************************/

九度OJ 1028:继续畅通工程 (最小生成树)的更多相关文章

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

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

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

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

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

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

  4. 九度OJ 1109:连通图 (最小生成树)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2783 解决:1432 题目描述: 给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的. 输入: 每组数据的第一行是两个整数 n ...

  5. 【九度OJ】题目1028:继续畅通工程 解题报告

    [九度OJ]题目1028:继续畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1028 题目描述: 省政府" ...

  6. 九度OJ 1024 畅通工程 -- 并查集、贪心算法(最小生成树)

    题目地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述:     省政府"畅通工程"的目标是使全省任何两个村庄间都可以实现公路交通(但 ...

  7. 【九度OJ】题目1024:畅通工程 解题报告

    [九度OJ]题目1024:畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1024 题目描述: 省政府"畅 ...

  8. 【九度OJ】题目1017:还是畅通工程 解题报告

    [九度OJ]题目1017:还是畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1017 题目描述: 某省调查乡村交通 ...

  9. 【九度OJ】题目1012:畅通工程 解题报告

    [九度OJ]题目1012:畅通工程 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1012 题目描述: 某省调查城镇交通状况 ...

随机推荐

  1. Java中Properties配置文件读取

    以下实践的是Properties配置文件的基本操作方法.像spring使用xml做依赖注入时,这个配置文件起到非常实用的作用. 一.格式规范 参考wiki百科的格式简介:https://zh.wiki ...

  2. Define Custom Data Filter Using Pre-Query Trigger In Oracle Forms

    Oracle Forms is having its default records filter, which we can use through Enter Query mode to spec ...

  3. mac 配置pylucene

    1 . 安装python 2  安装ant 3  下载pylucene 4  cd jcc , vim setup.py , 查看java路径和python路径是否正确 5 python setup. ...

  4. EasyMvc入门教程-基本控件说明(12)栏目导航

    栏目导航一般用来显示当前页面所在的模块层级位置关系,如下图所示: 当然也有前端网站作为小栏目导航,凡是没有绝对,只要不违和就好:),下面上代码: @{ var data = new List<N ...

  5. 实例化Spring容器的两种常用方式

    //在类路径下寻找配置文件来实例化容器 ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"b ...

  6. 关于js对象的基础使用方法-《javascript设计模式》读书笔记

    一.利用对象收编变量 当我们决定实现某一项功能的时候最简单的其实就是写一个命名函数,然后调用来实现,就像这样: function checkName(){ //验证姓名 } function chec ...

  7. Web前端开发规范收集

    在Web开发中,后端跟前端配合非常easy出现故障.这时我们就须要一些规则来约束前端任意的编写. CSS编程规范 1.      属性书写基本顺序 a.      先位置属性(position, to ...

  8. codeforces 204(Div.1 A) Little Elephant and Interval(贪心)

    题意: 有一种个位数与最高位数字相等的数字,求在l,r的范围内,这样的数字的个数. 思路: 找下规律就知道当当n>10的时候除去个位以后的答案等于n/10,然后考虑第一个数字是否小于最后一个.小 ...

  9. JavaScript replace 回调函数用法

    params.query = params.query.replace(/[\+\-\&\|\!\(\)\{\}\[\]\^\"\~\*\?\:\\]/g,function(a){ ...

  10. Android · SQLiteOpenHelper实例PrivateContactsDBHelper

    package privatecontact; import android.content.ContentValues; import android.content.Context; import ...