Prim 算法

求解方法:

首先将所指定的起点作为已选顶点,然后反复在满足如下条件下的边中选择一条最小边,直到

所有顶点已成为已选顶点为止(选择n-1条边)。

 #include "iostream"
using namespace std; typedef char Vertextype;//顶点类型
typedef int Edgetype;//边的权值类型 const int maxvex = ;//最大顶点数目
const int infinity = ;//无穷大 typedef struct
{
Vertextype vexs[maxvex];//图的定点存储
Edgetype edge[maxvex][maxvex];//图的边
int numVerTex,numEdge;//图的顶点数和边数
}graph; typedef struct{//候选边存储结构
Vertextype vertex;//未选定点对应候选边的另一顶点
int weight;//未选顶点对应候选边的权值
}MinEdgeType; typedef MinEdgeType MinEdgeArray[maxvex];//候选边的结构 /*
*图G中是否存在边(v,u)
*/
bool have_edge( graph *&g,int v,int u)
{
if(g->edge[v][u]!=infinity)return true;
else return false;
} /*
*初始化顶点v0候选边集
*/
int Init_MinEdges(graph *&g,MinEdgeArray &MinEdges,int v0)
{
int i;
for(i=;i<g->numVerTex;i++)//初始化每个未选顶点随影的候选边的相关信息
{
if(have_edge(g,v0,i))//若G中存在边(v0,i),设置顶点i到起点v0的候选信息,内容包括
{
MinEdges[i].vertex = g->vexs[v0];
MinEdges[i].weight = g->edge[v0][i];//另一短点以及相应的权值
}else MinEdges[i].weight = infinity;//否则,(v0,i)边不存在
}
return ;
} /*
*判断顶点v是否被选择
*/
bool judge(Vertextype v,Vertextype select[],int n)
{
int i;
bool flags = true;
for(i=;i<n;i++)
{
if(select[i]==v)
{
flags = false;
break;
}
}
return flags;
} /*
*从候选边集中选出最短的顶点
*/
int Get_MinEdge(graph *&g,MinEdgeArray &MinEdges,Vertextype select[],int n)
{
int MMin,i,k;
MMin = infinity;
for(i=;i<g->numVerTex;i++)
{
if((judge(g->vexs[i],select,n))&&(MinEdges[i].weight<=MMin))
{
k = i;
MMin = MinEdges[i].weight;
}
}
return k;
} /*
*对新选出的候选顶点k调整当前候选边集
*/
int change_MinEdge_with(graph *&g,MinEdgeArray &MinEdges,int k,Vertextype select[],int n)
{
int i;
for(i=;i<g->numVerTex;i++)
{
if(judge(g->vexs[i],select,n))//i是未选定点
{
if(have_edge(g,k,i)&&(g->edge[k][i]<MinEdges[i].weight))//若i到k有更小的边
{
MinEdges[i].vertex = g->vexs[k];
MinEdges[i].weight = g->edge[k][i];
}
}
}
return ;
} /*
*prim
*/
int prim(graph *&g,int v0)
{
int count = ;
Vertextype select_vertex[maxvex];
MinEdgeArray MinEdges;
int i,j,k;
select_vertex[count++] = g->vexs[v0];
Init_MinEdges(g,MinEdges,v0);
for(i=;i<g->numVerTex-;i++)
{
k = Get_MinEdge(g,MinEdges,select_vertex,count);
select_vertex[count++] = g->vexs[k];
change_MinEdge_with(g,MinEdges,k,select_vertex,count);
}
cout<<"Prim:";
for(i=;i<count;i++){
if(i!=count-)cout<<select_vertex[i]<<"->";
else cout<<select_vertex[i]<<endl;
}
cout<<endl;
return ;
}
int create(graph *&g)
{
int i,j,k,weight;
cout<<"input numVerTex(顶点数):";
cin>>g->numVerTex;
cout<<"input numEdge(边数):";
cin>>g->numEdge;
cout<<"input(各顶点):"<<endl;
for(i=;i<g->numVerTex;i++)
{
cin>>g->vexs[i];
}
for(i=;i<g->numVerTex;i++)
{
for(j=;j<g->numEdge;j++)
{
g->edge[i][j] = infinity;
}
}
cout<<"input(各边两个顶点对应的下标和权值i,j,weight,edge[i][j]=weight):"<<endl;
for(k=;k<g->numEdge;k++)
{
cout<<"i,j,weight:";
cin>>i>>j>>weight;
g->edge[i][j] = weight;
g->edge[j][i] = weight; }
cout<<endl;
return ;
} int main()
{
graph *g = new graph;
create(g);
Vertextype invertex;
int start;
cout<<"input start invertex:";
cin>>invertex; for(int i=;i<g->numVerTex;i++)
{
if(g->vexs[i]==invertex){
start = i;
}
}
prim(g,start);
return ;
}

6)图[2]Prim算法[最小生成树]的更多相关文章

  1. 数据结构与算法系列研究七——图、prim算法、dijkstra算法

    图.prim算法.dijkstra算法 1. 图的定义 图(Graph)可以简单表示为G=<V, E>,其中V称为顶点(vertex)集合,E称为边(edge)集合.图论中的图(graph ...

  2. 图——图的Prim法最小生成树实现

    1,运营商的挑战: 1,在下图标出的城市间架设一条通信线路: 2,要求: 1,任意两个城市间都能够通信: 2,将架设成本降至最低: 2,问题抽象: 1,如何在图中选择 n - 1 条边使得 n 个顶点 ...

  3. [讲解]prim算法<最小生成树>

    最小生成树的方法一般比较常用的就是kruskal和prim算法 一个是按边从小到大加,一个是按点从小到大加,两个方法都是比较常用的,都不是很难... kruskal算法在本文里我就不讲了,本文的重点是 ...

  4. Prim算法---最小生成树

    最小生成树的Prim算法也是贪心算法的一大经典应用.Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树. Prim算法过程: 一条边一条边地加, 维护一棵树. 初始 E = {}空 ...

  5. 图的最小生成树prim算法模板

    用prim算法构建最小生成树适合顶点数据较少而边较多的图(稠密图) prim算法生成连通图的最小生成树模板伪代码: G为图,一般为全局变量,数组d为顶点与集合s的最短距离 Prim(G, d[]){ ...

  6. 数据结构:最小生成树--Prim算法

    最小生成树:Prim算法 最小生成树 给定一无向带权图.顶点数是n,要使图连通仅仅需n-1条边.若这n-1条边的权值和最小,则称有这n个顶点和n-1条边构成了图的最小生成树(minimum-cost ...

  7. 最小生成树-普利姆(Prim)算法

    最小生成树-普利姆(Prim)算法 最小生成树 概念:将给出的所有点连接起来(即从一个点可到任意一个点),且连接路径之和最小的图叫最小生成树.最小生成树属于一种树形结构(树形结构是一种特殊的图),或者 ...

  8. 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。

    //归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...

  9. C++编程练习(10)----“图的最小生成树“(Prim算法、Kruskal算法)

    1.Prim 算法 以某顶点为起点,逐步找各顶点上最小权值的边来构建最小生成树. 2.Kruskal 算法 直接寻找最小权值的边来构建最小生成树. 比较: Kruskal 算法主要是针对边来展开,边数 ...

随机推荐

  1. for应用

    应用:迭代法,穷举法.一.迭代法:有一定规律. 每次循环都是从上次运算结果中获得数据,本次运算的结果都是要为下次运算做准备.例:1.100以内所有数的和.2.求阶乘3.求年龄.4.折纸.5.棋盘放粮食 ...

  2. 在sql数据库变量中保存单引号的办法

    set @strWhere=' AccountName like '+'''%'+@Condition+'%''' 先用'+''''+要在单引号里的内容+''''. 就这样就行了. 主要就是用三个单引 ...

  3. list 去重复

    两层遍历,如果后面的元素和前面的相同,就把后面的删除,达到去重复的目的. 比较的元素可以是list中含有的任意唯一性的元素. for(int x = 0;x < xglist.size()-1; ...

  4. 1、 Linux中的root用户切换(转载)

    su和su - 的区别 大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户,Linux中切换用户的命令是su或s ...

  5. Linux学习之nl命令

    nl命令在linux系统中用来计算文件中行号.nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等 ...

  6. 21个值得收藏的Javascript技巧

    1  Javascript数组转换为CSV格式 首先考虑如下的应用场景,有一个Javscript的字符型(或者数值型)数组,现在需要转换为以逗号分割的CSV格式文件.则我们可以使用如下的小技巧,代码如 ...

  7. javascript自定义日期函数

    1.格式化日期(YYYY-MM-DD) 代码: var DateFormat = function (date) { if (!(date instanceof Date)) { date = dat ...

  8. html语法之--使用图像映射

    1 什么是图像映射所谓图像映射是指在一幅图中定义若干个区域,每个区域中指定一个不同的超链接,当单击不同的区域时便可以跳转到相应的目标页面. 2 创建图像映射 2.1 定义映射区域 定义映射区域使用MA ...

  9. J2SE知识点摘记(十八)

    Java容器类类库的用途是“保存对象”,并将其划分为两个不同的概念: 1)  Collection . 一组对立的元素,通常这些元素都服从某种规则.List必须保持元素特定的顺序,而Set 不能有重复 ...

  10. Android程序的入口点

    原文:Android程序的入口点 android应用程序,由一到多个Activity组成.每个Activity没有很紧密的联系,因为我们可以在自己的程序中调用其它Activity,特别是调用自己的代码 ...