图算法—Problem E
来源:互联网 发布:数据规范性的名词解释 编辑:程序博客网 时间:2024/05/17 21:58
图算法—Problem E
题意
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。现得到城镇道路统计表,表中列出了任意两城镇间修建道路的费用,以及该道路是否已经修通的状态。现请你编写程序,计算出全省畅通需要的最低成本。
解题思路
不多说,还是最小生成树问题。用的Kruskal方法。
感想
最近忙着复习,哎,事情好多,acm不能停。
AC代码
#include <stdio.h> #include <algorithm> using namespace std; struct Road { int u,v,c; }r[10001]; int n,m,father[10001]; bool cmp(Road r1,Road r2) { return r1.c<r2.c; } // 并查集系列函数 1-初始化 2-查找 3-合并 void Init( int n ) { int i; for(i=1;i<=n;++i) father[i]=i; } int Find(int m) { while( father[m]!=m ) { m=father[m]; } return m; } void Combine( int a,int b) { int temp_a,temp_b; temp_a=Find(a); temp_b=Find(b); if( temp_a!=temp_b ) father[temp_a]=temp_b; } int Kruskal( void ) { sort(r,r+m,cmp); Init(n); Road rd; int i,res; // 构建最小生成树 res=0; for( i=0;i<m;++i ) { rd=r[i]; if( Find(rd.u)!=Find(rd.v) ) { Combine(rd.u,rd.v); res+=rd.c; } } return res; } int main() { int i,start,finish,cost,iscon; while( scanf("%d",&n) && n ) { // 求边的数量 m = n*(n-1)/2; for( i=0;i<m;++i ) { scanf("%d%d%d%d",&start,&finish,&cost,&iscon); r[i].u=start; r[i].v=finish; // 如果道路已经修建,消耗设置为0,不需要我们再去建立道路 if( iscon ) r[i].c=0; else r[i].c=cost; } printf("%d\n",Kruskal()); } return 0; }
0 0
- 图算法—Problem E
- 贪心算法—Problem E
- Problem E: 质心算法
- 贪心算法 Problem E 1004
- 贪心算法problem E(编号1004)
- 动态规划—Problem E
- Problem E
- Problem E
- Problem E
- Problem E
- Problem E
- Problem E
- Problem E
- Problem E
- problem E
- Problem E
- Problem E
- Problem E
- Android实训案例(三)——实现时间轴效果的ListView,加入本地存储,实现恋爱日记的效果!
- 系统 day67 Linux入门
- asp.net core开发环境准备
- 关于各种排序复杂度,哈夫曼树,路由器作用
- Html-知识点总结
- 图算法—Problem E
- 机器学习实战读书笔记(序)
- 自定义dialog
- pushScene,popScene和runScene的区别
- IDEA JRebel热部署插件免费使用方法
- Android实训案例(四)——关于Game,2048方块的设计,逻辑,实现,编写,加上色彩,分数等深度剖析开发过程!
- ImageFilter 开源图像滤镜类库的使用
- 一天一条Linux指令-find
- 课程练习四-ProblemJ