最小生成树(kruskal)
2015-10-04 23:46
351 查看
先来前排卖个瓜子,推荐个oj:一个神奇的oj
http://oj.fjaxyz.com:3389/problem.php?id=69
这时, 如何在最节省经费的前提下建立这个通信网。
在每两个城市之间都可以设置—条线路,相应地都要付出一定的经济代价。
n个城市之间,最多可能设置n(n- 1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢?
这题是裸的最小生成树,何为最小生成树?就是一张图,n个点,n-1条边,且边上的权值加起来还要最小
这题的样例图如下
69 通信线路
http://oj.fjaxyz.com:3389/problem.php?id=69
题目描述
假设要在n个城市之间建立通信联络网,则连通n个城市只需要n-1条线路。这时, 如何在最节省经费的前提下建立这个通信网。
在每两个城市之间都可以设置—条线路,相应地都要付出一定的经济代价。
n个城市之间,最多可能设置n(n- 1)/2条线路,那么,如何在这些可能的线路中选择n-1条,以使总的耗费最少呢?
这题是裸的最小生成树,何为最小生成树?就是一张图,n个点,n-1条边,且边上的权值加起来还要最小
这题的样例图如下
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; int f[300]; struct graph { int from,to,dis; }a[45000]; bool cmp(graph x,graph y) { return x.dis<y.dis; } int find(int x) { return f[x]==x?x:f[x]=find(f[x]); } int main() { int n,b,k=1,i,j,x,y,ans=0; scanf("%d",&n); for(i=1;i<=n;i++) f[i]=i; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&b); if(j<=i || b==-1) continue; a[k].from=i; a[k].to=j; a[k++].dis=b; } } sort(a+1,a+k,cmp); for(i=1;i<k;i++) { x=find(a[i].from); y=find(a[i].to); if(x!=y) { ans+=a[i].dis; f[y]=x; } } printf("%d\n",ans); return 0; }
69 通信线路
相关文章推荐
- 剑指offer—连续子数组的最大和
- 场景转场动画的Canvas实现
- Linux入门的一些快捷键
- php 基于PDO的预处理
- 获取安卓中的资源文件并按行读取
- OOP—ECMAScript实现详解
- 基本数据类型_整型_JAVA007
- java高薪之路__008_Annotation
- tinyxml源码的使用
- Java基础知识点总结(二)
- HTTP error Code
- flume通过thrift协议收集日志-Python
- Mac下配置Ant、NDK和Android SDK环境
- java---教你怎么判断多线程是否安全
- 数据结构【线性表(二)链表】自建算法库之循环单链表
- SpringAOP嵌套调用的解决办法
- Markdown介绍
- Linux FSCK自动修复文件系统
- Git & GitHub 学习
- windows performance