Description

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

Input

测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。

Output

对每个测试用例,在1行里输出最小的公路总长度。

Sample Input

3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0

Sample Output

3

5

解题思路:

典型的最小生成树的问题,利用krusal算法代码简洁效率高。

但是在构建图的时候尽量不要用邻接矩阵,因为邻接矩阵既浪费空间有耗时间,采用邻接表更好

正解:

#include<cstdio>
#include<algorithm>
typedef struct
{int from;int to;int value;
}Node,*node;
int Find(int *father,int x)
{if(x!=father[x])father[x]=Find(father,father[x]);return father[x];
}
void Union(int *father,int from,int to)
{int a=Find(father,from);int b=Find(father,to);father[a]=b;
}
bool cmp(const Node & a,const Node & b)
{return a.value<b.value;//从小到大排序
}
using namespace std;
int main()
{int N,i=0;while(~scanf("%d",&N),N){Node mp[N*N+1];int father[N+1];for(i=0;i<=N;i++)father[i]=i;for(i=0;i<N*(N-1)/2 ;i++)scanf("%d%d%d",&mp[i].from,&mp[i].to,&mp[i].value);sort(mp,mp+N*(N-1)/2,cmp);int sum=0;for(i=0;i<N*(N-1)/2;i++){if(Find(father,mp[i].from)!=Find(father,mp[i].to)){Union(father,mp[i].from,mp[i].to);sum+=mp[i].value;}//printf("%d %d %d\n",mp[i].from,mp[i].to,mp[i].value);}printf("%d\n",sum);}return 0;
}

开始写时的错误代码:

因为”动态“数组的边界数开的范围不正确

#include<algorithm>//Runtime Error(ACCESS_VIOLATION)
#include<cstdio>
int Find(int * helper,int a)//传递了数组的地址 
{
if(a!=helper[a])
helper[a]=Find(helper,helper[a]);
return helper[a];
}//并查集FIND 
void Union(int * helper,int a,int b)//传递了数组的地址 
{
int x=Find(helper,a);//找a的父节点 
int y=Find(helper,b);//b的父节点 
helper[y]=x;//合并 
}//并查集UNION 
typedef struct M
{
int a;
int b;
int v;
}Node;//存储图的边(u,v)以及对应的值 
bool cmp(const Node & x,const Node & y)
{
return x.v<y.v;
}//sort排序,对值进行降序排序 
using namespace std;
int main(void)
{
int N;
while(scanf("%d",&N)!=EOF&&N)
{
Node vex[N];//存储(u,v)关系(错误) 
int helper[N+1];//新建并查集 
for(int i=0;i<N+1;i++)
helper[i]=i;//并查集初始化 
int T=0;
while(T!=N*(N-1)/2)
scanf("%d%d%d",&vex[T].a,&vex[T].b,&vex[T++].v);
sort(vex,vex+N,cmp);
int sum=0;
for(int i=0;i<N;i++)//K...算法 
{
if(Find(helper,vex[i].a)!=Find(helper,vex[i].b))
{
Union(helper,vex[i].a,vex[i].b);
sum+=vex[i].v;//记录树的总值 

}
printf("%d\n",sum);
}
return 0;
}

还是畅通工程(思想+代码)相关推荐

  1. hdu1232畅通工程(并查集)

    Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通 ...

  2. HDOJ 畅通工程 1232(并查集入门)

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

  3. 畅通工程//最小生成树prim

    题目: 畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  4. HDOJ 1874 HDU 1874 畅通工程续 ACM 1874 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 题目地址:          http://acm.hdu.edu.cn/showproblem.php?pid=1874 ...

  5. hdu1879 继续畅通工程 最小生成树

    继续畅通工程 此题明显属于最小生成树的题目 关于最小生成树,有两种方法,一种是Kruskal方法,一种是Prim算法,第一种用并查集即可实现 1 /* 2 hdu1879 3 2013-03-18 1 ...

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

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

  7. HDUOJ---1863畅通工程

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

  8. 杭电1232 畅通工程

    Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通 ...

  9. 九度OJ 1028:继续畅通工程 (最小生成树)

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

最新文章

  1. Java list三种遍历方法性能比较
  2. 牛顿第三定律不再起作用:芝加哥大学找到了一种新系统,作用力不等于反作用力...
  3. 灵活管理Hadoop各发行版的运维利器 - vSphere Big Data Extensions
  4. Cookie 学习案例之三天免登录
  5. 下载安装oracle旧版本oracle 12c的详细步骤
  6. jsf tree组件_JSF和“立即”属性–命令组件
  7. secoclient隧道保活超时或协商超时_推荐:承德市隧道led大屏厂家电话【联丰智慧科技】...
  8. arcgis工具_地理工具学习--arcgis篇(16):标准距离
  9. 单独像对相对定向元素解析
  10. ArchiSteamFarm(ASF优秀的Steam挂卡工具) V4.0.3.3绿色版
  11. 计算机大一总结,大一计算机学习心得总结.doc
  12. [树形dp] Jzoj P1162 贪吃的九头龙
  13. 斯皮尔 皮尔森 肯德尔_失焦图像的无参考质量评价
  14. 中小型企业开发门户网站我建议你选择阿里云的云速美站
  15. php文字转语音amr,如何将文字转成语音?这几个方法一分钟搞定!
  16. C#开发基于ESMTP协议的邮件发送系统经验总结
  17. 未来计算机行业什么最吃香,未来哪些行业吃香 这四个行业前景比较好
  18. 如何提取图片中的文字
  19. Python Pandas的DataFrame对象中轴的意义,axis=0 或者axis=1代表什么意思?
  20. 基于JAVA-游戏账号交易平台-演示录像-计算机毕业设计源码+系统+mysql数据库+lw文档+部署

热门文章

  1. 现代程序设计 作业 2
  2. 大学计算机基础水平,大学计算机基础心得.docx
  3. 如何把html转换cad,Tab2Xls插件(捷克版)将AutoCAD表格转换为XLS、CSV或HTML。
  4. mysql日期纬度表_mysql中生成时间维度表
  5. 如何给python升级_python升级后,如何给virtualenv里的python进行升级
  6. 厦门大学2016年c语言程序设计,厦门大学c语言程序设计2016模拟题讲评及课程复习.pptx...
  7. Java 启动和停止界面_一文详解各种花里胡哨的Java调试技巧,多图预警,记得收藏...
  8. python json模块详解_深入解析Python编程中JSON模块的使用
  9. java 文件夹存在文件_Java判断是否存在文件和文件夹
  10. 排序算法 --- 堆排序