题目:

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

分析与解答

kruskal算法:
按边的权值的顺序从小到大查一遍,如果不产生圈,(即是说u,v不在一个连通分量里),就把当前这条边(uv之间距离)加入生成树中。

先看kruskal算法把,我那个sort第一次wa了,就是因为我下标是从一开始的。

修修改改五分钟写了八道,我算是看出点门道,如果题目是以邻接矩阵形式出现,就用prim算法,否则用kruskal算法。
而且这种题如果加额外条件,那无非就是改了一下标记数组而已。。

#include<cstdio>
#include<algorithm>
using namespace std;
int pre[10100 ];
int find(int x)                                       //查找根节点
{ int r=x;while ( pre[r] != r )                           //返回根节点 rr=pre[r];int i=x , j ;while( i != r )                                   //路径压缩{j = pre[ i ];                //j是i的原来的父结点 pre[ i ]= r ;                //现在把i的父结点改成根节点 i=j;                       //再把j的父节点改成根节点 }return r ;
}
void join(int x,int y)                           //判断x y是否连通,//如果已经连通,就不用管了 如果不连通,就把它们所在的连通分支合并起,
{int fx=find(x),fy=find(y);if(fx!=fy)pre[fx ]=fy;
}struct node {int u,v,e;
};
bool cmp(node a,node b){return a.e<b.e;
}
node edg[10010];
int m,sum;
int k(){sort(edg+1,edg+m+1,cmp);for(int i=1;i<=m;++i) pre[i]=i;sum=0;for(int i=1;i<=m;++i){if(find(edg[i].u) != find(edg[i].v)){join(edg[i].u,edg[i].v);sum+=edg[i].e;} } return sum;
}
int main()
{int t;while(scanf("%d",&t)){if(t==0) return 0;m=t*(t-1)/2;for(int i=1;i<=m;++i){scanf("%d%d%d",&edg[i].u,&edg[i].v,&edg[i].e);}printf("%d\n",k());}    }

(kruskal)还是畅通工程相关推荐

  1. Kruskal HDOJ 1233 还是畅通工程

    题目传送门 1 /* 2 最小生成树之kruskal算法--并查集(数据结构)实现 3 建立一个结构体,记录两点和它们的距离,依照距离升序排序 4 不连通就累加距离,即为最小生成树的长度 5 */ 6 ...

  2. hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)

    还是畅通工程                                                                            Time Limit: 4000/2 ...

  3. 还是畅通工程(prim和kruskal)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    ...

  4. HDU1875 畅通工程再续【Kruskal算法+并查集】

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  5. HDU1233 还是畅通工程【Kruskal算法+并查集】

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

  6. HDU1863 畅通工程【Kruskal算法+并查集】

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

  7. HDU 1233 还是畅通工程(最小生成树 Prim+Kruskal)

    原题地址 http://acm.hdu.edu.cn/showproblem.php?pid=1233 题意:(最小生成树裸题)有N个村庄,给出村庄两两之间的距离,要求铺设公路,使得任何两个村庄间都可 ...

  8. 还是畅通工程(1233 并查集+kruskal)

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

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

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

最新文章

  1. 如何正确选择开源数据库?你需要这的5个技巧
  2. 授以渔 - Autodesk Forge 学习简谈 - 引言
  3. (winform cookie)如何向某网址Post信息,并得到CookieContainer以便以后直接通过验证...
  4. Java Web应用的代码分层最佳实践
  5. vue @click 多个事件_VUE学习记录3
  6. python旋转矩阵_python – 来自两个3D点的Euler角度和旋转矩阵
  7. python程序如何执行死刑_「Python基础知识」Python生成器函数
  8. 互联网移动在“云”端
  9. MySQL 实例空间使用率过高的原因和解决方法
  10. 区块链 性能压力测试工具Caliper
  11. 网络工程师计算机职称考试,软考网络工程师中级职称评定条件
  12. AWS Elastic BeanStalk 部署错误总结
  13. 解决:U盘无法安装到这个磁盘选中的磁盘具有MBR分区表
  14. 伪原创文章特点(高质量的伪原创文章有哪些特点)
  15. 九龙证券|服务器龙头获资金连续抢筹,尾盘主力抢筹前期大热门股
  16. 生产者与消费者的实现
  17. 数论读书笔记——欧几里得和扩展欧几里得
  18. 高度平衡二叉树的构建_平衡二叉树 构造方法(绝妙)
  19. TT语音:游戏社交乱象难平
  20. MAC运行软件后出现意外退出及崩溃的修复方法

热门文章

  1. mysql中int、bigint、smallint 和 tinyint的区别与长度
  2. Command10,Access数据库
  3. Kubernetes 部署 Ingress 控制器 Traefik v1.7.4
  4. CentOS7.0下Hadoop2.7.3的集群搭建
  5. 利用NCO 3.0 调用SAP中的函数
  6. ginapi服务器性能,如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (一)
  7. python字符串类型_Python3的字符串类型(疯狂Python)
  8. 遵义大数据中心项目工程概况_中策大数据:8月建筑工程项目有哪些?建筑工程项目信息汇总...
  9. Win7文件夹属性没有共享标签页的解决方法
  10. Edge浏览器怎么打开开发者模式