堆优化prim算法C语言,最小生成树(二)--prim算法实现以及堆优化
一、最小生成树---prim算法实现
思想:
1、从任意一个顶点开始构造生成树,假设就从1号顶点吧, 首先将顶点1加入生成树中,用一个一维数组book来标记 哪些顶点已经加入了生成树。
2、用数组dis记录生成树到各个顶点的距离,最初生成树中之后1号 顶点,有直连边时,数组dis中存储的就是1号顶点到该顶点 的边的权值,没有直连边的时候就是无穷大,即初始化dis数组。
3、从数组dis中选出离生成树最近的顶点(假设这个顶点为j) 加入到生成树中(即在数组dis中找到最小值)。再以j为中间点, 更新生成树到每一个非树顶点的距离(就是松弛啦), 即如果dis[k]>e[j][k]则更新dis[k]=e[j][k]。
4、重复第三步,直到生成树中有n个顶点为止。
代码实现:
#includeint main(void)
{
int n,m,i,j;
int k,min;
int t1,t2,t3;
int e[7][7],dis[7];
int book[7]={0};//book数组初始化
int inf=99999999;
int count=0,sum=0;
//count用来记录生成树中顶点的个数,sum用来存储路径之和
scanf("%d %d",&n,&m);
//读入n,m,n表示顶点的个数,m表示边的条数。
//初始化
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i==j)
{
e[i][j]=0;
}
else
{
e[i][j]=inf;
}
}
}
//开始读入边
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
//注意无向图,需要将边反向在存储一遍
e[t1][t2]=t3;
e[t2][t1]=t3;
}
//初始化dis数组,这里是1号顶点到各个顶点的初始距离,因为当前生成树中只有1号顶点
for(i=1;i<=n;i++)
{
dis[i]=e[1][i];
}
//将1号顶点加入生成树,这里book来标记一个顶点是否已经加入生成树
book[1]=1;
count++;
while(counte[j][k])
{
dis[k]=e[j][k];
}
}
}
printf("%d\n",sum);
return 0;
}
二、最小生成树—prim算法的堆优化
需要用到三个数组
1、数组dis用来记录生成树到各个顶点的距离
2、数组h是一个最小堆,堆里面存储的是顶点编号。(请注意,这里并不是按照顶点编号的大小来建立最小堆的,而是按照顶点在数组dis中所对应的值来建立这个最小堆的)
3、pos数组来记录每个顶点在最小堆中的位置
例如,下图中
下面最小堆中的圆圈中存储的是顶点编号,圆圈右下角的数是该顶点(圆圈里面的数)到生成树的最短距离,即数组dis中存储的值
代码实现:
#includeint dis[7],book[7]={0};
//book数组用来记录哪些顶点已经放入生成树中
int h[7],pos[7],size;
//h数组用来保存堆,pos数组用来存储每个顶点在堆中的位置,size为堆的大小
//交换函数,用来交换堆中的两个元素的值
void swap(int x,int y)
{
int t;
t=h[x];
h[x]=h[y];
h[y]=t;
//同步更新pos
t=pos[h[x]];
pos[h[x]]=pos[h[y]];
pos[h[y]]=t;
}
//向下调整函数,传入一个需要向下调整的结点编号
void siftdown(int i)
{
int t,flag=0;
//flag用来标记是否需要继续向下调整
while(i*2<=size&&flag==0)
{
//比较i和它左儿子i*2在dis中的值,并用t记录值较小的结点编号
if(dis[h[i]]>dis[h[i*2]])
{
t=i*2;
}
else
{
t=i;
}
//如果它有右儿子,再对右儿子进行讨论
if(t*2+1<=size)
{
//如果右儿子的值更小,更新较小的结点编号
if(dis[h[t]]>dis[h[i*2+1]])
{
t=i*2+1;
}
}
//如果发现最小的结点编号不是自己,说明子结点中有比父结点更小的
if(t!=i)
{
//交换它们
swap(t,i);
//更新i为刚才与它交换的儿子结点的编号,便于接下来继续向下调整
i=t;
}
else
{
//否则说明当前的父结点已经比两个子结点都要小了,不需要再进行调整了
flag=1;
}
}
}
//传入一个需要向上调整的结点编号i
void siftup(int i)
{
int flag=0;
//flag用来标记是否需要继续向上调整
if(i==1)
{
//如果是堆顶,就返回,不需要调整
return ;
}
//不在堆顶,并且当前结点i的值比父结点小的时候继续向上调整
while(i!=1&&flag==0)
{
//判断是否比父结点的小
if(dis[h[i]]=1;i--)
{
siftdown(i);
}
//先弹出一个堆顶元素,因为此时堆顶是1号顶点
pop();
while(countw[k])
{
//更新距离
dis[v[k]]=w[k];
//对该点在堆中进行向上调整
//pos[v[k]]存储的是顶点v[k]在堆中的位置
siftup(pos[v[k]]);
}
k=next[k];
}
}
printf("%d\n",sum);
return 0;
}
堆优化prim算法C语言,最小生成树(二)--prim算法实现以及堆优化相关推荐
- kruskal算法c语言,最小生成树之Kruskal算法
上一篇文章中提到了最小生成树的Prim算法,这一节继续探讨一下最小生成树的Kruskal算法.什么是最小生成树算法上文已经交代过了,所以我们直接从Kruskal的步骤开始介绍. 1.Kruskal算法 ...
- #1098 : 最小生成树二·Kruscal算法
#1098 : 最小生成树二·Kruscal算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用 ...
- hihoCoder-1098最小生成树二·Kruscal算法 (最小生成树)
最小生成树二·Kruscal算法 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了--但是幸运的是,经过计算机的分析,小Hi已经筛选出了一些比较适合建造道路的路线,这个 ...
- 最近最久未使用页面置换算法C语言,LRU页面置换算法模拟-最近最久未使用置换算法...
LRU页面置换算法模拟-最近最久未使用置换算法 LRU页面置换算法模拟-最近最久未使用置换算法|课程设计|计算机数据库课程设计 一.设计目的 1.用C语言实现最近最久未使用(LRU)置换算法. 2.了 ...
- bwt比对算法 C语言,DNA比对算法:BWT
DNA比对算法:BWT BWT算法,实质上是前缀树的一种实现.那么什么是前缀树呢? 一.前缀树 对于问题p in S?如果S=rpq,那么p为S前缀rp的一个后缀. 于是,为了判断p in S 是否成 ...
- 妙趣横生的算法(c语言实现),妙趣横生的算法(C++语言实现) 带目录完整pdf[4MB]
<妙趣横生的算法(C++语言实现)>内容丰富,生动有趣,寓教于乐,旨在帮助读者学习数据结构和算法的相关知识,从而开阔眼界,培养编程兴趣,提高编程能力,增强求职的竞争力.如果您想提高自己对算 ...
- c语言程序设计 算法,C语言程序设计第二章算法
<C语言程序设计第二章算法>由会员分享,可在线阅读,更多相关<C语言程序设计第二章算法(38页珍藏版)>请在人人文库网上搜索. 1.C程序设计,主讲人:袁丽,燕大里仁基础教学部 ...
- 短进程算法c语言,短进程优先算法C语言实现
短进程优先算法C语言实现 1.本实验实现了短进程优先的进程调度操作,但因为是非抢占式,所以实现起来比较简单. 短进程优先算法是以作业的长短来计算优先级,作业越短,其优先级越高.作业的长短是以作业所要求 ...
- 用c语言编写插入排序算法,C语言实现常用排序算法——插入排序
插入排序是最基础的排序算法,原理: 首先1个元素肯定是有序的,所以插入排序从第二个元素开始遍历: 内循环首先请求一个空间保存待插入元素,从当前元素向数组起始位置反向遍历: 当发现有大于待插入元素的元素 ...
最新文章
- 盘点图灵30篇最受欢迎微信文章
- element-ui + vue + node.js 与 服务器 Python 应用的跨域问题
- 池化方法总结(Pooling)
- Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶
- C++:C++语言入门级基础知识考察点回顾之函数、结构体和类
- fgo服务器维护补偿什么时候才有,fgo国服4月12日版本版本更新公告 维护18个小时 补偿18个圣晶石...
- boost::reverse_lock相关的测试程序
- android物理健代码,Android 物理按键整理及实例代码
- 解决常见接口跨域问题
- (一二一)核心动画基础
- (转载)数据库的三范式:我见过讲的最通俗易懂的三范式!!!
- 详解springBoot集成activiti7,工作流实战案例(三)
- win7安装后计算机不在桌面,win7重装系统后进不了桌面的解决措施
- 基恩士PLC④--MAIN程序实例笔记
- 机场云商sign解析
- 安装杀毒软件后计算机运行速度慢,ThinkPad运行速度慢怎么办
- 语义分割论文:Fully Convolutional Networks for Semantic Segmentation (CVPR2015)
- PS_BaseUse_红眼擦拭
- 亚马逊ERP系统无货源采集上货软件
- word怎么删除红色波浪线