畅通工程
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1863
TimeLimit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8916 Accepted Submission(s): 3454
ProblemDescription
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M (< 100 );随后的 N
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
Output
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
SampleInput
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
SampleOutput
3
?
解题思路:
这一题是一个典型的并查集案例题,这一题主要的解题思路是用刚学的并查集的示例代码来实现的。用一个findSet(int x)函数来查找x节点的根节点,返回该跟节点的下标
用一个结构体array来表示某个节点的值,值x城市到y城市之间的距离为z,输入的时候,先将输入的路线按照城市与城市之间的距离z进行排序,连接的时候将结构体array数组的值作为该下标的父节点,这样进行递归查找,当路线的条数等于城市数-1是就输出,如果到最后建立起来的数的路线总数小于路线的条数等于城市数-1,也表示不可达
代码实现:
#include <stdio.h>
#include<iostream>
#include <algorithm>
using namespace std;
int set[102];//每个节点,现在是一颗只有一个节点的树
struct array {
int x;
int y;
int z;
};
int findSet(int x) {//查找x节点的根节点
if (x == set[x]) {//返回该下标
return x;
} else {
return set[x] = findSet(set[x]);
}
}
int main() {
int n, m;
int count = 0;//计算总路线数量,n个节点n-1条边
int sum = 0;//总价
int i,j;
array a[100];
array temp;
//array a[100];
while (scanf("%d", &n)) {
if (n != 0) {//输入不为0时
sum = 0;
count = 0;
scanf("%d", &m);
for (i = 1; i <= n; i++) {
set[i] = i;
scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z); //第一个村庄a[i].x与第二个村庄a[i].y之间的距离a[i].z
}
for (i = 1; i <= n; i++) {
for (j = i + 1; j <= n; j++) {//从小到大排序
if (a[i].z > a[j].z) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
for (i = 1; i <= n; i++) {
int fx = findSet(a[i].x);
int fy = findSet(a[i].y);
if (fx==fy) {//有相同的父节点,则不用在连接了
continue;
} else {//连接两个节点
set[fx] = fy ;
count++;//路线总数
sum += a[i].z;
}
if (count == m - 1) {
break;
}
}
if(count<m-1)
{//输出不符合情况
printf("?\n");
}
else//输出总和
printf("%d\n", sum);
} else {
break;
}
}
return 0;
}
分享到:
相关推荐
杭电hdu acm资料所用杭电的acm题
HDU_ACM培训课件(完整版) HDU_ACM培训课件(完整版) HDU_ACM培训课件(完整版) HDU_ACM培训课件(完整版)
hdu_2102_passed_sorce
杭电 hdu acm 第1084题的解法,ac过了,是一位学长教我的.内有一些中文说明.
此程序为hdu的acm2010题,就是解决水仙花数问题
模式识别_hdu_期末复习资料集合_试卷笔记.zip
题目链接题目意思有n个城镇,编号为0~n-1,m条道路,从一个城镇到另一个城镇有多条路,现在问你从一个城镇到另一个城镇的最短距离是多少。其中要注意的是,城镇之间
HDU_ACM_1002_大数相加C源代码,利用字符串处理
数字图像处理_hdu_期末复习资料_试卷等.zip
数字图像处理总ppt_hdu_许老师.pdf
高级计算机图形学_mm的_重点笔记_hdu_吴xy.pdf
HDU一部分题目原码,大部分是可运行的,可能有几题不完整
B_(HDU_1231)(最大子段和,分治).cpp
杭电acm解题报告 详细解析2000-2099 适合acm初学者
杭电OJ部分答案,可以很简单的解决a+b求和问题及其他问题。
For a positive integer n, let’s denote function f(n,m) as the m-th smallest integer x that x>n and gcd(x,n)=1. For example, f(5,1)=6 and f(5,5)=11. You are given the value of m and (f(n,m)?...
hdu题解的答案十分简单的一个题,思路清晰,特别简单
hdu 3378 三国杀标程 解题报告
动态规划DP题解 POJ HDU部分动态规划DP题解
基础算法类 ACM 入门 杭电OJ 11页题目题解,算法入门的时候刷题可以参考 搜集整理起来了比单个去搜题解方便快捷