一、最小生成树---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算法实现以及堆优化相关推荐

  1. kruskal算法c语言,最小生成树之Kruskal算法

    上一篇文章中提到了最小生成树的Prim算法,这一节继续探讨一下最小生成树的Kruskal算法.什么是最小生成树算法上文已经交代过了,所以我们直接从Kruskal的步骤开始介绍. 1.Kruskal算法 ...

  2. #1098 : 最小生成树二·Kruscal算法

    #1098 : 最小生成树二·Kruscal算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用 ...

  3. hihoCoder-1098最小生成树二·Kruscal算法 (最小生成树)

    最小生成树二·Kruscal算法 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了--但是幸运的是,经过计算机的分析,小Hi已经筛选出了一些比较适合建造道路的路线,这个 ...

  4. 最近最久未使用页面置换算法C语言,LRU页面置换算法模拟-最近最久未使用置换算法...

    LRU页面置换算法模拟-最近最久未使用置换算法 LRU页面置换算法模拟-最近最久未使用置换算法|课程设计|计算机数据库课程设计 一.设计目的 1.用C语言实现最近最久未使用(LRU)置换算法. 2.了 ...

  5. bwt比对算法 C语言,DNA比对算法:BWT

    DNA比对算法:BWT BWT算法,实质上是前缀树的一种实现.那么什么是前缀树呢? 一.前缀树 对于问题p in S?如果S=rpq,那么p为S前缀rp的一个后缀. 于是,为了判断p in S 是否成 ...

  6. 妙趣横生的算法(c语言实现),妙趣横生的算法(C++语言实现) 带目录完整pdf[4MB]

    <妙趣横生的算法(C++语言实现)>内容丰富,生动有趣,寓教于乐,旨在帮助读者学习数据结构和算法的相关知识,从而开阔眼界,培养编程兴趣,提高编程能力,增强求职的竞争力.如果您想提高自己对算 ...

  7. c语言程序设计 算法,C语言程序设计第二章算法

    <C语言程序设计第二章算法>由会员分享,可在线阅读,更多相关<C语言程序设计第二章算法(38页珍藏版)>请在人人文库网上搜索. 1.C程序设计,主讲人:袁丽,燕大里仁基础教学部 ...

  8. 短进程算法c语言,短进程优先算法C语言实现

    短进程优先算法C语言实现 1.本实验实现了短进程优先的进程调度操作,但因为是非抢占式,所以实现起来比较简单. 短进程优先算法是以作业的长短来计算优先级,作业越短,其优先级越高.作业的长短是以作业所要求 ...

  9. 用c语言编写插入排序算法,C语言实现常用排序算法——插入排序

    插入排序是最基础的排序算法,原理: 首先1个元素肯定是有序的,所以插入排序从第二个元素开始遍历: 内循环首先请求一个空间保存待插入元素,从当前元素向数组起始位置反向遍历: 当发现有大于待插入元素的元素 ...

最新文章

  1. 盘点图灵30篇最受欢迎微信文章
  2. element-ui + vue + node.js 与 服务器 Python 应用的跨域问题
  3. 池化方法总结(Pooling)
  4. Edit Distance编辑距离(NM tag)- sam/bam格式解读进阶
  5. C++:C++语言入门级基础知识考察点回顾之函数、结构体和类
  6. fgo服务器维护补偿什么时候才有,fgo国服4月12日版本版本更新公告 维护18个小时 补偿18个圣晶石...
  7. boost::reverse_lock相关的测试程序
  8. android物理健代码,Android 物理按键整理及实例代码
  9. 解决常见接口跨域问题
  10. (一二一)核心动画基础
  11. (转载)数据库的三范式:我见过讲的最通俗易懂的三范式!!!
  12. 详解springBoot集成activiti7,工作流实战案例(三)
  13. win7安装后计算机不在桌面,win7重装系统后进不了桌面的解决措施
  14. 基恩士PLC④--MAIN程序实例笔记
  15. 机场云商sign解析
  16. 安装杀毒软件后计算机运行速度慢,ThinkPad运行速度慢怎么办
  17. 语义分割论文:Fully Convolutional Networks for Semantic Segmentation (CVPR2015)
  18. PS_BaseUse_红眼擦拭
  19. 亚马逊ERP系统无货源采集上货软件
  20. word怎么删除红色波浪线

热门文章

  1. AI人才招聘:年薪最高近百万,独角兽公司招算法工程师
  2. 做SEO和SEM有什么区别?哪个推广效果会更好?
  3. python 视频拼接
  4. 最长递增子序列(python)
  5. echarts map 点击地图区域变色_绘制炫酷的地图,不只是pyecharts!
  6. 设计师必备取色技巧!教你在PS里通过照片创建色板
  7. PHP for循环执行流程
  8. AI面试必备/深度学习100问1-50题答案解析
  9. PM未来的核心竞争力是什么?(上)
  10. 【AUTOSAR】01-汽车电子控制系统介绍