关于最小生成树的概念,在前一篇文章中已经讲到,就不在赘述了。下面介绍Prime算法:

        其基本思想为:从一个顶点出发,选择由该顶点出发的最小权值边,并将该边的另一个顶点包含进来,然后找出由这两个顶点出发的最小边,依此类推,直至包含所有的顶点。如果期间构成环,就舍弃该边,继续寻找最小边。下面以具体实例来说明算法的过程:

具体的程序实现如下:

#include<stdio.h>

#define N 6 //顶点数
#define MAX 10000
typedef struct
{
	int startvex,endvex;//边的起点和终点2
	int length;//边的权值
}edge;

int flag[N]={0};//标志顶点是否被选定
int flag1=0;//记录边的终点
int flag2=0;//记录边的起点

void Prime(int  i,int dist[N][N],edge T[N-1])
{
	int j,k,min;
	int num=0;
	flag[i]=1;//包含顶点置为1
	while(num<5)//6个顶点则有5条边
	{
		min=MAX;
		for(j=0;j<N;j++)//从已选边中找到最小权值的边
		{
			if(flag[j]==1)
				for(k=0;k<N;k++)
				{
					if(dist[j][k]<min)
					{
						min=dist[j][k];
						flag1=k;//记录当前最小权值边的起点和终点
						flag2=j;
					}
				}
		}

		if(flag[flag1]!=1)//判断是否构成回路
		{
			T[num].startvex=flag2;//将找到的最小权值边记录
			T[num].endvex=flag1;
			T[num].length=dist[flag2][flag1];
			num++;
			flag[flag1]=1;
		}
		dist[flag2][flag1]=MAX;//将已经选择的边的权值置为无穷大
	}
	for(int i=0;i<N-1;i++)
		printf("start=%d,end=%d,length=%d\n",T[i].startvex,T[i].endvex,T[i].length);
}

void main()
{
	int dist[N][N]={{MAX,10,MAX,MAX,19,21},
					{10,MAX,5,6,MAX,11},
					{MAX,5,MAX,6,MAX,MAX},
					{MAX,6,6,MAX,18,14},
					{19,MAX,MAX,18,MAX,33},
					{21,11,MAX,14,33,MAX}};
	edge T[N-1];
	Prime(1,dist,T);//1代表从序号为一的顶点开始
}

运行结果如下:

注意最小生成树不是唯一的,但是总权值是一样的。

注:如果程序出错,可能是使用的开发平台版本不同,请点击如下链接: 解释说明

原文:http://blog.csdn.net/tengweitw/article/details/17421329

作者:nineheadedbird

【算法导论】最小生成树之Prime法的更多相关文章

  1. 算法导论--最小生成树(Kruskal和Prim算法)

    转载出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51908175 关于图的几个概念定义: 连通图:在无向图中,若任意两个顶 ...

  2. 最小生成树之Prime法

    关于最小生成树的概念,在前一篇文章中已经讲到,就不在赘述了.下面介绍Prime算法:         其基本思想为:从一个顶点出发,选择由该顶点出发的最小权值边,并将该边的另一个顶点包含进来,然后找出 ...

  3. 《算法导论》学习总结 — XX.第23章 最小生成树

    一.什么叫最小生成树 一个无向连通图G=(V,E),最小生成树就是联结所有顶点的边的权值和最小时的子图T,此时T无回路且连接所有的顶点,所以它必须是棵树. 二.为什么要研究最小生成树问题 <算法 ...

  4. 最小生成树(prime算法 & kruskal算法)和 最短路径算法(floyd算法 & dijkstra算法)

    一.主要内容: 介绍图论中两大经典问题:最小生成树问题以及最短路径问题,以及给出解决每个问题的两种不同算法. 其中最小生成树问题可参考以下题目: 题目1012:畅通工程 http://ac.jobdu ...

  5. Prime算法 与 Kruskal算法求最小生成树模板

    算法原理参考链接 ==> UESTC算法讲堂——最小生成树 关于两种算法的复杂度分析 ==> http://blog.csdn.net/haskei/article/details/531 ...

  6. 基本数据结构(2)——算法导论(12)

    1. 引言     这一篇博文主要介绍链表(linked list),指针和对象的实现,以及有根树的表示. 2. 链表(linked list) (1) 链表介绍      我们在上一篇中提过,栈与队 ...

  7. MIT算法导论——第二讲.Solving Recurrence

    本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...

  8. MIT算法导论——第四讲.Quicksort

    本栏目(Algorithms)下MIT算法导论专题是个人对网易公开课MIT算法导论的学习心得与笔记.所有内容均来自MIT公开课Introduction to Algorithms中Charles E. ...

  9. 算法导论学习-Dynamic Programming

    转载自:http://blog.csdn.net/speedme/article/details/24231197 1. 什么是动态规划 ------------------------------- ...

随机推荐

  1. MongoDB 删除文档

    ongoDB remove()函数是用来移除集合中的数据. MongoDB数据更新可以使用update()函数.在执行remove()函数前先执行find()命令来判断执行的条件是否正确,这是一个比较 ...

  2. python转lua最容易掉进去的坑--作用域

    你以为会依次打印2,4,8吗? 错. 2,2,2 value = 1 for i=1,3 do local value = value*2 print(value) end 你以为打印1吗?,错,输出 ...

  3. Android中Sqlite数据库进行增删改查

    今天这篇文章写Sqlite数据库,通过一个小案例来完整讲一下数据库常见的CRUD操作. 先对知识点总结: SQLite数据库 轻量级关系型数据库 创建数据库需要使用的api:SQLiteOpenHel ...

  4. Swift类型推测在可选调用中的小提示

    我们知道Swift中协议里也有对应于Objc中的可选方法或计算属性,当然协议必须以@objc伪指令修饰否则不可以哦. 如下示例: @objc protocol Transaction{ fun com ...

  5. java自动装箱拆箱总结

    对于java1.5引入的自动装箱拆箱,之前只是知道一点点,最近在看一篇博客时发现自己对自动装箱拆箱这个特性了解的太少了,所以今天研究了下这个特性.以下是结合测试代码进行的总结. 测试代码: int a ...

  6. EBS开发之环境迁移

    (一)环境迁移说明 1.1   迁移 由于EBS系统开发复杂,一般项目实施都是使用三套或者三套以上的系统,一套作为开发使用系统,一套作为集成测试系统,一套就是企业用的正式环境系统,在项目实施过程中对一 ...

  7. 源码篇——Handler消息机制

    Handler消息机制 Message 消息 Message.obtain() Message msg = new Message() Handler new Handler(){ handlerMe ...

  8. xlsx批量转为utf8的csv

    xlsx批量转为utf8的csv(金庆的专栏)策划的配置表为 xlsx 表格,可以有注释,公式.服务器和客户端使用的配置文件需要转成 csv 文件.使用 WPS 另存无法批量转换,并且结果不是utf8 ...

  9. GDAL库扩展Landsat系列MTL文件格式支持

    Landsat系列卫星提供的数据,一般都是每个波段一个tif文件,然后外加一个MTL.txt的元数据文件,使用gdal可以直接打开每个波段的tif文件,但是有时候想在打开tif数据的同时能够自动读取M ...

  10. gitlab的搭建及问题的解决

    gitlab则是类似于github的一个工具,github无法免费建立私有仓库,并且为了代码安全,于是在内网安装了一个自己实验室的一个git服务器,gitlab有很多依赖,而bitnami制作了一键安 ...