带你辨析最小生成树的两种算法
最小生成树的算法通常由在几个城市中间修筑路径使其连通并且花费最小引出。如下图所示引例。
多数求最小生成树算法都应用了简称为MST的性质:假设N=(V,{E})是一个连通网,U是顶点V的一个非空子集。若(u,v)是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一个包含(u,v)的最小生成树。
下面介绍普里姆算法:
prime算法的基本思想
1.构造一个空树,任取一个顶点加入生成树
2.在那些一个端点在生成树里,另一个端点不在生成树里的边中,选取一条权最小的边,将它和另一个端点加进生成树
3.重复步骤2,直到所有的顶点都进入了生成树为止,此时的生成树就是最小生成树
int prime(int cur)
{int index;int sum = 0;memset(visit, false, sizeof(visit));visit[cur] = true;for(int i = 0; i < m; i ++){dist[i] = graph[cur][i]; }for(int i = 1; i < m; i ++){int mincost = INF;for(int j = 0; j < m; j ++){if(!visit[j] && dist[j] < mincost){mincost = dist[j];index = j; } }visit[index] = true;sum += mincost;for(int j = 0; j < m; j ++){if(!visit[j] && dist[j] > graph[index][j]){dist[j] = graph[index][j];} } } return sum;
}
克鲁斯卡尔算法:
令最小生成树的初始状态为只有n个顶点而不具有边的非连通图T=(V,{}),使其每个顶点自成一个连通分量,在E边集中依次选择代价自小的边,如果边依附的顶点落在T中不同的连通分量上,则将其加入到T中,否则舍弃此边选择下一条代价最小的边。
#include<iostream>
#include<algorithm>
using namespace std;const int size = 128;
int n;
int father[size];
int rank[size];//把每条边成为一个结构体,包括起点、终点和权值
typedef struct node
{int val;int start;int end;
}edge[SIZE * SIZE / 2];//把每个元素初始化为一个集合
void make_set()
{for(int i = 0; i < n; i ++){father[i] = i;rank[i] = 1; } return ;
}//查找一个元素所在的集合,即找到祖先
int find_set(int x)
{if(x != father[x]){father[x] = find_set(father[x]); } return father[x];
}//合并x,y所在的两个集合:利用Find_Set找到其中两个
//集合的祖先,将一个集合的祖先指向另一个集合的祖先。
void Union(int x, int y)
{x = find_set(x); y = find_set(y);if(x == y){return ; }if(rank[x] < rank[y]){father[x] = find_set(y); }else{if(rank[x] == rank[y]){rank[x] ++; } father[y] = find_set(x);}return ;
}bool cmp(pnode a, pnode b)
{return a.val < b.val;
}int kruskal(int n) //n为边的数量
{int sum = 0;make_set();for(int i = 0; i < n; i ++){ //从权最小的边开始加进图中 if(find_set(edge[i].start) != find_set(edge[i].end)){Union(edge[i].start, edge[i].end);sum += edge[i].val; } }return sum;
}int main()
{while(1){scanf("%d", &n); if(n == 0){break; }char x, y;int m, weight;int cnt = 0;for(int i = 0; i < n - 1; i ++){cin >> x >> m; //scanf("%c %d", &x, &m); //printf("%c %d ", x, m);for(int j = 0; j < m; j ++){cin >> y >> weight; //scanf("%c %d", &y, &weight);//printf("%c %d ", y, weight); edge[cnt].start = x - 'A';edge[cnt].end = y - 'A';edge[cnt].val = weight;cnt ++;}}sort(edge, edge + cnt, cmp); //对边按权从小到大排序 cout << kruskal(cnt) << endl; }
}
初看两种算法看似是一样的都在选择最小边加入集合,普里姆算法是从已加入集合的点向未加入集合的点连代价最小的边(即不断地选择点),直到构成最小生成树。而克鲁斯卡尔算法是在任意两点间选择最小的代价(即选择边)只要其不形成环。
带你辨析最小生成树的两种算法相关推荐
- java进程调度怎么画图,[Java教程]进程调度的两种算法JAVA实现
[Java教程]进程调度的两种算法JAVA实现 0 2015-10-21 12:00:08 (SJF分为preemptive shortest job first(抢占式)和non-preemptiv ...
- rls lms 对比 matlab,自适应均衡器的LMS和RLS两种算法的特性与仿真分析
自适应均衡属于自适应信号处理的应用范畴,各种各样的自适应均衡算法如迫零(ZF)算法.最小均方(LMS)算法.递归最小二乘(RLS)算法.变换域均衡算法.Bussgang算法.高阶或循环统计量算法.基于 ...
- 图——最短路径的两种算法
最短路径 在生活中,例如,当我们坐公交或轻轨时,都会看一下交通图,找到在哪个站下是最快能达到目的地的,也就是路径最小.考虑到交通图的有向性,例如汽车的上山下山.轮船的顺水逆水,所花费的时间或代价就不相 ...
- “斐波那契数列”的两种算法
"斐波那契数列"的两种算法 斐波那契数列有个规律:从第三个数开始,每个数是前两个数之和,比如: 1 1 2 3 5 8 13 21 34 55...... 现在通过两种方式(递归与 ...
- ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能
ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 estimator = PC ...
- ML之RFDT:利用RF(RFR)、DT(DTR)两种算法实现对boston(波士顿房价)数据集进行训练并预测
ML之RF&DT:利用RF(RFR).DT(DTR)两种算法实现对boston(波士顿房价)数据集进行训练并预测 目录 输出结果 实现代码 输出结果 1.两种算法的预测结果 2.回归树的可视化 ...
- 在.Net framework下遍历XML文挡树的两种算法
在阅读ASP.NET_XML深入编程技术 (PDF格式)一书的时候,发现遍历树的两种算法:深度优先和广度优先遍历文挡树,前一种需要使用递归,后者则不需要,本人大学时期数据结构学的不好,每每涉及到树,总 ...
- Fletcher-Reevers Conjugate Descent和Steepest Descent两种算法中伪代码的区别
本文主要用来比较两个算法到底差别在哪里 step Fletcher-Reevers Conjugate Descent Steepest Descent 1st1st1st 选择初始点x(1)选择初始 ...
- 一文带你掌握OBS的两种常见的鉴权方式
OBS提供了REST(Representational State Transfer)风格API,支持您通过HTTP/HTTPS请求调用.在调用OBS的API前,需要了解OBS的鉴权认证方式.本文就将 ...
最新文章
- css 识别变量中的换行符_跟我一起全面了解一下CSS变量
- SCCM2012之客户端发现与安装
- 创业者需要知道的50句话
- mysql python 中文_python操作mysql中文显示乱码的解决方法
- POJ 1141 Brackets Sequence
- 蓝桥杯 ADV-105 算法提高 不同单词个数统计
- linux下更新JDK版本
- Java用for语法找素数,求1-100的质数,用FOR循环。求救。。
- MSF的辅助扫描模块(信息搜集)
- 依托智慧警务 打造城市公共安全防控新模式
- 微信小程序实现vtt视频字幕
- Javascript变量名混淆细节
- Nginx代理域名证书替换失效
- RDF(Resource Description Framework)
- 小甲鱼python游戏代码_【小甲鱼】零基础学习python pygame 飞机大战可执行源代码...
- NCBI genebank refseq 编号意义
- 开始入坑-大蟒蛇首发
- 使用一根USB线便在电脑上控制树莓派
- 僵尸毁灭工程服务器耐久修改,僵尸毁灭工程无限负重的修改方法
- jaeger分布式链路追踪
热门文章
- opencv中CV_IMAGE_ELEM的用法读取每个像素
- 搜索的艺术——搜索引擎使用心得
- 博客网页bootstra
- 齐鲁师范学院计算机专业师资,齐鲁师范学院特色专业介绍_计算机科学与技术_专业课程介绍_专业排名_就业方向...
- 论文笔记 Entity-Relation Extraction as Multi-turn Question Answering | ACL2019
- VSCode 官网,下载安装包太慢,将地址中的 az764295.vo.msecnd.net 更换为 vscode.cdn.azure.cn
- 综述:边缘视频在公共安全领域的应用
- WEB 2.0 字体
- od机考真题-求n阶方阵里的所有数的和
- ubuntu开启TFTP服务和NFS服务