// Prim算法实现(采用邻接表存储).cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdafx.h"
#include<iostream>
#define MAX 100
#define Infinity 65535
typedef int WeiType;
using namespace std;
struct edgeNode
{
int no; //边端的序号
char info; //边端的名称
WeiType weight; //边的权值
struct edgeNode * next; //下一个
};
struct vexNode
{
char info; //节点名称
struct edgeNode *link; //与之相连的端点
};
//存储节点信息
vexNode adjlist[MAX];
//访问标志
bool visited[MAX];
//lowcost[j]存储从开始节点到节点j的最小花费
WeiType lowcost[MAX];
//parent[j]表示节点j的前驱节点
int parent[MAX];
//建立邻接表存储
void createGraph(vexNode *adjlist,const int n,const int e,const int v0)
{
int i;
for(i=1;i<=n;i++)
{
cout<<"请输入节点"<<i<<"的名称:";
cin>>adjlist[i].info;
adjlist[i].link = NULL;
//初始化
visited[i] = false;
lowcost[i] = Infinity;
parent[i] = v0;
}
edgeNode *p1,*p2;
int v1,v2;
WeiType weight;
for(i=1;i<=e;i++)
{
cout<<"请输入边"<<i<<"的二端的节点序号:";
cin>>v1>>v2;
cout<<"此边的权值:";
cin>>weight;
p1 = (edgeNode*)malloc(sizeof(edgeNode));
p2 = (edgeNode*)malloc(sizeof(edgeNode));
p1->no = v1;
p1->weight = weight;
p1->info = adjlist[v1].info;
p1->next = adjlist[v2].link;
adjlist[v2].link = p1;
p2->no = v2;
p2->weight = weight;
p2->info = adjlist[v2].info;
p2->next = adjlist[v1].link;
adjlist[v1].link = p2;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int cases;
cout<<"请输入案例的个数:";
cin>>cases;
while(cases--)
{
int n,e;
cout<<"请输入节点数:";
cin>>n;
cout<<"请输入边数:";
cin>>e;
cout<<"请输入从哪一个节点开始:";
int v;
cin>>v;
int i,j;
//最小生成树的权值总和
WeiType sum = 0;
createGraph(adjlist,n,e,v);
edgeNode *p,*q;
p = adjlist[v].link;
visited[v] = true;
while(p!=NULL)
{
lowcost[p->no] = p->weight;
p = p->next;
}
WeiType minCost;
for(i=1;i<n;i++)
{
minCost = Infinity;
int k;
for(j=1;j<=n;j++)
{
if(minCost>lowcost[j]&&!visited[j])
{
minCost = lowcost[j];
k = j;
}
}
sum += minCost;
visited[k] = true;
q = adjlist[k].link;
while(q != NULL)
{
if(!visited[q->no]&&q->weight<lowcost[q->no])
{
lowcost[q->no] = q->weight;
parent[q->no] = k;
}
q = q->next;
}
}
cout<<"最小生成树的边集为:"<<endl;
for(i=1;i<=n;i++)
if(i!=v)
cout<<"("<<adjlist[parent[i]].info<<","<<adjlist[i].info<<")"<<" ";
cout<<endl;
cout<<"最小生成树的权值为:"<<sum<<endl;
}
system("pause");
return 0;
}
-----------------------------------------------------程序测试--------------------------------------------------
请输入案例的个数:1
请输入节点数:9
请输入边数:14
请输入从哪一个节点开始:2
请输入节点1的名称:a
请输入节点2的名称:b
请输入节点3的名称:c
请输入节点4的名称:d
请输入节点5的名称:e
请输入节点6的名称:f
请输入节点7的名称:g
请输入节点8的名称:h
请输入节点9的名称:i
请输入边1的二端的节点序号:1 2
此边的权值:4
请输入边2的二端的节点序号:1 8
此边的权值:8
请输入边3的二端的节点序号:2 3
此边的权值:8
请输入边4的二端的节点序号:2 8
此边的权值:11
请输入边5的二端的节点序号:3 4
此边的权值:7
请输入边6的二端的节点序号:3 6
此边的权值:4
请输入边7的二端的节点序号:3 9
此边的权值:2
请输入边8的二端的节点序号:4 5
此边的权值:9
请输入边9的二端的节点序号:4 6
此边的权值:14
请输入边10的二端的节点序号:5 6
此边的权值:10
请输入边11的二端的节点序号:6 7
此边的权值:2
请输入边12的二端的节点序号:7 8
此边的权值:1
请输入边13的二端的节点序号:7 9
此边的权值:6
请输入边14的二端的节点序号:8 9
此边的权值:7
最小生成树的边集为:
(b,a) (b,c) (c,d) (d,e) (c,f) (f,g) (g,h) (c,i)
最小生成树的权值为:37
请按任意键继续. . .
分享到:
相关推荐
在这个程序中,我们将深入探讨Prim算法的原理、C++实现以及如何通过它来找到一个图的最小生成树。 首先,Prim算法的基本思想是从一个顶点开始,逐步添加边到当前生成树中,每次添加的边都是与当前生成树连接的新...
- 在C++实现中,Prim算法通常使用优先队列(如二叉堆)来快速找到最小权重的边,以及邻接矩阵或邻接表来存储图的信息。 3. **Kruskal算法**: - Kruskal算法也是贪心算法,但其策略是从图中最小的边开始选择,并...
在`Prim_test`这个测试文件中,可能包含了具体的C++源码实现,包括图的定义、邻接矩阵或邻接表的初始化、Prim算法的具体逻辑等。通过阅读和分析这个测试文件,你可以更好地理解Prim算法的细节,例如如何处理特殊情况...
在C++中实现Prim算法,首先需要定义图的数据结构,通常可以使用邻接矩阵或邻接表来表示。邻接矩阵是一个二维数组,用于存储图中任意两个顶点之间的边及其权重;而邻接表则使用链表或vector来存储每个顶点的邻接节点...
通过以上步骤,我们可以成功地用C++实现Prim算法来寻找一个无向加权图的最小生成树。在实际应用中, Prim算法和其他MST算法如Kruskal算法都有其适用场景,根据数据结构和问题特性选择合适的算法可以提高效率。在处理...
在提供的压缩包文件"5最小生成树Prim"中,很可能包含了使用C++实现Prim算法的具体代码示例。通过阅读和分析这段代码,你可以了解到如何将上述步骤转化为实际的编程逻辑,以及如何利用C++的数据结构和算法库来高效地...
在"最小生成树Prim算法代码.zip"这个压缩包中,可能包含了用不同编程语言实现的Prim算法示例代码,如Python、Java、C++等。这些代码可以用来理解和学习如何在实际问题中应用Prim算法。通过阅读和理解这些代码,参赛...
最小生成树是图论中的一个重要概念...总结来说,这个C++代码实现了Prim算法,通过邻接矩阵存储图数据,寻找并构造加权无向图的最小生成树。在实际应用中,这种算法常用于优化网络连接、设计成本最低的基础设施等问题。
本项目以MATLAB的邻接表表示为基础,实现了Prim算法,并将其集成到MFC(Microsoft Foundation Classes)图形用户界面中,提供了一种直观的交互方式来处理图数据和展示最小生成树的结果。MFC是微软为Windows应用程序...
Prim算法的核心思想是维护一个已选择的顶点集合和未选择的顶点集合,每次将未选择顶点中与已选择顶点相连的边中权重最小的一条加入到生成树中,直到所有的顶点都被包含在内。在C++中,可以使用优先队列(如二叉堆)...
在Prim算法的实现中,可以使用优先队列(如C++中的`priority_queue`)来快速找到未访问顶点中与S集合距离最小的顶点。 以下是Prim算法的简化流程: 1. 初始化:设置集合S为空,vis数组所有元素设为false,d数组除...
在编程实现Prim算法时,通常会用到邻接矩阵或邻接表来存储图的信息。邻接矩阵适用于表示稠密图,而邻接表更适合稀疏图,因为它能节省空间。此外,为了提高效率,可以使用优先队列(如Java的`PriorityQueue`或C++的`...
在C++中实现这两种算法,你需要理解图的数据结构,如邻接矩阵或邻接表,并掌握相关的数据结构,如堆和并查集。同时,要熟练使用C++的STL库,例如`<queue>`和`<set>`,这些工具可以帮助你更高效地实现算法。 在提供...
这个C++程序演示了如何使用Prim算法找到给定图的最小生成树,并输出最小生成树的总权重。注意,实际应用中可能需要对输入数据进行预处理,以确保图的合法性,并处理边的权重为零的情况,以避免无限循环。
在`PrimMST`文件中,可以找到Prim算法的C++实现,包括邻接矩阵或邻接表的表示、优先队列的使用以及算法的主体部分。 **代码解析** `KruskalMST`和`PrimMST`文件分别实现了Kruskal和Prim算法。代码可能包含以下几个...
总结来说,最小生成树算法是图论中的重要概念,Prim和Kruskal是其常见解法,而数据结构如邻接矩阵、邻接表、二叉堆和并查集则为实现这些算法提供了支持。这个压缩包的内容将帮助你理解和掌握这些知识,进一步拓展你...
Prim算法是求无向图的最小生成树的一种常用算法,该算法使用邻接矩阵或邻接表来表示图。Prim算法的主要思想是从图中的一个顶点开始,逐步添加边,使得生成树的权值之和最小。 在 Prim 算法中,我们首先需要输入图的...
Prim算法的基本思想是从图中任意选取一个顶点作为起点,然后逐步添加边,每次添加一条使得当前生成树与图中剩余部分的边权之和最小的边。这个过程会不断进行,直到所有顶点都被包含在生成树中。下面我们将详细探讨...
在C++中实现Prim算法,可以使用优先队列(如二叉堆)来存储边和它们的权重,以快速找到最小边。 2. **Kruskal算法**: Kruskal算法同样基于贪心思想,但它的策略是从所有边中按权重升序排序,然后依次考虑每条边,...
在C++编程中,实现最小生成树的算法通常有两种经典方法:Prim算法和Kruskal算法。 **1. Prim算法** Prim算法是一种贪心策略,它从任意一个起点开始,逐步添加边,每次添加的边都是当前未被包含在生成树中的、与已...