最小生成树Kruskal算法
Kruskal算法就是把图中的所有边权值排序,然后从最小的边权值开始查找,连接图中的点,当该边的权值较小,但是连接在途中后会形成回路时就舍弃该边,寻找下一边,以此类推,假设有n个点,则只需要查找n-1条边即可。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int maxn=;
int v,l;///v代表点的个数,l代表边的个数
int fa[maxn],son[maxn];
struct Kruskal{///该结构体时存储点与这两点之间的距离的
int a,b;
int value;
}edge[maxn];
bool cmp(Kruskal x,Kruskal y){///把边的权值按从小到大的顺序排列
return x.value<y.value;
}
int fin(int x)///寻找x的根结点
{
return fa[x]==x?fa[x]:fin(fa[x]);
}
bool unin(int x,int y)
{
int root1,root2;
root1=fin(x);
root2=fin(y);
if(root1==root2){
return false;///当输入的两个点有相同的根结点时成环,返回false
}
else if(son[root1]>=son[root2]){
fa[root2]=root1;///root2的根结点时root1
son[root1]+=son[root2];///把数量少的那棵树连接到数量多的那棵树
}
else {
fa[root1]=root2;
son[root2]+=son[root1];
}
return true;///只要两个点不在同一个根结点上就返回true
}
int main()
{
int n,total,sum,flag;
cin>>n;
while(n--){
cin>>v>>l;
total=;
sum=;
flag=;
for(int i=;i<=v;i++){///初始化
fa[i]=i;
son[i]=;
}
for(int i=;i<=l;i++){
cin>>edge[i].a>>edge[i].b>>edge[i].value; }
sort(edge+,edge++l,cmp);///因为edge时从1开始的,所以edge要+1
for(int i=;i<=l;i++){
if(unin(edge[i].a,edge[i].b)){
total++;
sum+=edge[i].value;///记录最小的权值
cout<<edge[i].a<<"->"<<edge[i].b<<endl;
}
if(total==v-){///有n个结点就有n-1条边构成最小生成树
flag=;
break;
} }
if(flag)cout<<sum<<endl;
else cout<<"data error ."<<endl; }
}
最小生成树Kruskal算法的更多相关文章
- 【转】最小生成树——Kruskal算法
[转]最小生成树--Kruskal算法 标签(空格分隔): 算法 本文是转载,原文在最小生成树-Prim算法和Kruskal算法,因为复试的时候只用到Kruskal算法即可,故这里不再涉及Prim算法 ...
- 最小生成树——kruskal算法
kruskal和prim都是解决最小生成树问题,都是选取最小边,但kruskal是通过对所有边按从小到大的顺序排过一次序之后,配合并查集实现的.我们取出一条边,判断如果它的始点和终点属于同一棵树,那么 ...
- 最小生成树------Kruskal算法
Kruskal最小生成树算法的概略描述:1 T=Φ:2 while(T的边少于n-1条) {3 从E中选取一条最小成本的边(v,w):4 从E中删去(v,w):5 if((v,w)在T中不生成环) { ...
- 求最小生成树——Kruskal算法
给定一个带权值的无向图,要求权值之和最小的生成树,常用的算法有Kruskal算法和Prim算法.这篇文章先介绍Kruskal算法. Kruskal算法的基本思想:先将所有边按权值从小到大排序,然后按顺 ...
- 最小生成树 kruskal算法&prim算法
(先更新到这,后面有时间再补,嘤嘤嘤) 今天给大家简单的讲一下最小生成树的问题吧!(ps:本人目前还比较菜,所以最小生成树最后的结果只能输出最小的权值,不能打印最小生成树的路径) 本Tianc在刚学的 ...
- 算法实践--最小生成树(Kruskal算法)
什么是最小生成树(Minimum Spanning Tree) 每两个端点之间的边都有一个权重值,最小生成树是这些边的一个子集.这些边可以将所有端点连到一起,且总的权重最小 下图所示的例子,最小生成树 ...
- 模板——最小生成树kruskal算法+并查集数据结构
并查集:找祖先并更新,注意路径压缩,不然会时间复杂度巨大导致出错/超时 合并:(我的祖先是的你的祖先的父亲) 找父亲:(初始化祖先是自己的,自己就是祖先) 查询:(我们是不是同一祖先) 路径压缩:(每 ...
- 数据结构之最小生成树Kruskal算法
1. 克鲁斯卡算法介绍 克鲁斯卡尔(Kruskal)算法,是用来求加权连通图的最小生成树的算法. 基本思想:按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路. 具体做法:首先构造一个 ...
- 数据结构:最小生成树--Kruskal算法
Kruskal算法 Kruskal算法 求解最小生成树的还有一种常见算法是Kruskal算法.它比Prim算法更直观.从直观上看,Kruskal算法的做法是:每次都从剩余边中选取权值最小的,当然,这条 ...
随机推荐
- nova分析(8)—— nova-compute
nova-compute是管理和配置虚拟机的入口,在所有compute机器上都需要该服务来创建和管理虚拟机. nova-compute服务的入口在 nova.cmd.compute:main ,其启动 ...
- 面向对象设计模式--观察者模式(Observer)
要点: 1.如何使用观察者模式: 对应使用这个模式的用户(main)来说,subject和observer这两个基类是不被关系的,在调用者(main)中只是有concreteSubject和concr ...
- (转)手机端html5触屏事件(touch事件)
本文转载自:http://blog.sina.com.cn/s/blog_51048da70101f0ex.html touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时 ...
- 【原创】VNC-view配置
*.hl_mark_KMSmartTagPinkImg{background-color:#ffaaff;}*.hl_mark_KMSmartTagBlueImg{background-color:# ...
- freeswitch编译
编译1.6版本的话,debian的包就太老,需要添加新源 echo "deb http://files.freeswitch.org/repo/deb/debian/ jessie main ...
- C++设计新思维的traits和policy
http://blog.csdn.net/zhoudaxia/article/details/4486487 这篇博客讲得挺清楚的,本来想自己写写看总结下的,不过看了下这个文章已经写得很清楚了,倒没有 ...
- 【linux】之安装mysql常用配置
下载mysql地址 http://dev.mysql.com/downloads/mysql/ 选择下面这个 查看是否存在mysql安装包 rpm -qa|grep -i mysql 删除mysql安 ...
- 黄聪:在WordPress后台文章编辑器的上方或下方添加提示内容
WordPress 3.5 新增了一对非常有用的挂钩,可以快速在WordPress后台文章编辑器的上方或下方添加提示内容,下面是一个简单的例子,直接将代码添加到主题的 functions.php 文件 ...
- java.util.concurrent
软件包 java.util.concurrent 的描述 在并发编程中很常用的实用工具类.此包包括了几个小的.已标准化的可扩展框架,以及一些提供有用功能的类,没有这些类,这些功能会很难实现或实现起来冗 ...
- python的装饰器
什么是python的装饰器? 网络上的定义: 装饰器就是一函数,用来包装函数的函数,用来修饰原函数,将其重新赋值给原来的标识符,并永久的丧失原函数的引用. 在google上搜索下python 装饰器 ...