最小生成树的Prim算法提高型实验报告
最小生成树 实验报告

最小生成树实验报告最小生成树实验报告一、引言最小生成树是图论中的一个重要概念,它在实际问题中有着广泛的应用。
本次实验旨在通过编程实现最小生成树算法,并通过实验数据对算法进行分析和评估。
二、算法介绍最小生成树算法的目标是在给定的带权无向图中找到一棵生成树,使得树上所有边的权重之和最小。
本次实验我们选择了两种经典的最小生成树算法:Prim 算法和Kruskal算法。
1. Prim算法Prim算法是一种贪心算法,它从一个顶点开始,逐步扩展生成树的规模,直到包含所有顶点为止。
算法的具体步骤如下:(1)选择一个起始顶点,将其加入生成树中。
(2)从与生成树相邻的顶点中选择一个权重最小的边,将其加入生成树中。
(3)重复上述步骤,直到生成树包含所有顶点。
2. Kruskal算法Kruskal算法是一种基于并查集的贪心算法,它首先将图中的边按权重从小到大进行排序,然后逐个加入生成树中,直到生成树包含所有顶点为止。
算法的具体步骤如下:(1)将图中的边按权重从小到大进行排序。
(2)逐个加入边,如果该边的两个顶点不在同一个连通分量中,则将其加入生成树中。
(3)重复上述步骤,直到生成树包含所有顶点。
三、实验过程本次实验我们使用C++语言实现了Prim算法和Kruskal算法,并通过随机生成的图数据进行了测试。
1. Prim算法的实现我们首先使用邻接矩阵表示图的结构,然后利用优先队列来选择权重最小的边。
具体实现过程如下:(1)创建一个优先队列,用于存储生成树的候选边。
(2)选择一个起始顶点,将其加入生成树中。
(3)将与生成树相邻的顶点及其边加入优先队列。
(4)从优先队列中选择权重最小的边,将其加入生成树中,并更新优先队列。
(5)重复上述步骤,直到生成树包含所有顶点。
2. Kruskal算法的实现我们使用并查集来维护顶点之间的连通关系,通过排序后的边序列来逐个加入生成树中。
具体实现过程如下:(1)将图中的边按权重从小到大进行排序。
最小生成树 实验报告

最小生成树(Minimum Spanning Tree)实验报告1. 实验目的本实验旨在通过实践掌握最小生成树算法的基本原理和实现方法。
最小生成树是图论中的一个重要概念,用于解决具有权重的连通图的最优路径问题。
通过本实验,我们将学习如何使用最小生成树算法找到一棵连接图的所有节点且总权重最小的树。
2. 实验原理最小生成树是一个连通图的一种生成树,它的所有边的权重之和最小。
最小生成树的求解算法有多种,其中两种常用的算法是 Prim 算法和 Kruskal 算法。
2.1 Prim 算法Prim 算法是一种贪心算法,从一个节点开始,逐步扩展最小生成树的边。
具体步骤如下: 1. 选择一个起始节点作为最小生成树的根节点。
2. 在当前最小生成树的所有节点中选择一个与该树相连接的权重最小的边,将其加入最小生成树。
3. 将该节点标记为已访问。
4. 重复步骤 2 和步骤 3,直到所有节点都被访问。
2.2 Kruskal 算法Kruskal 算法也是一种贪心算法,通过不断选择权重最小的边来构建最小生成树。
具体步骤如下: 1. 对所有边按照权重进行排序。
2. 依次选择权重最小的边,如果该边的两个端点不在同一个连通分量中,则将该边加入最小生成树,并将这两个端点合并到同一个连通分量中。
3. 重复步骤 2,直到所有节点都在同一个连通分量中,即最小生成树构建完成。
3. 实验步骤本实验将使用 Prim 算法和 Kruskal 算法分别求解给定图的最小生成树。
3.1 数据准备首先,我们需要准备一个具有权重的连通图作为实验数据。
假设该图有 n 个节点和 m 条边,我们可以使用邻接矩阵或邻接表来表示这个图。
3.2 Prim 算法求解最小生成树1.首先,选择一个起始节点作为最小生成树的根节点,并将该节点标记为已访问。
2.初始化一个空的最小生成树,用于存储最终的结果。
3.重复以下步骤,直到所有节点都被访问:1.在当前最小生成树的所有节点中选择一个与该树相连接的权重最小的边,将其加入最小生成树。
Prim最小生成树 实验报告含源码

实验报告题目说明:POJ2395 Out of Ray题目大意:Beth有m个农场,农场之间有些相通,有些不通。
已知,Beth每一英里要一盎司的水,Beth希望走遍所有的农场但携带最少的水。
问:Beth最多需要带多少水?(每个农场都可以补充水)本程序利用Prim算法俩实现题目要求。
1.<创建>输入农场数和农场之间的距离(均为整数),程序给出连通判断。
2.修改路径按格式输入修改值,此时路线可能会改变。
3.<输出最大携带水量>,附上最小生成树实验说明:1.基本思想利用邻接表G [ ][ ] 储存农场信息,然后使用Prim算法来完成最小生成树的构建;最后寻找出最大边,如果农场是不连通的将给出提示,可以对路径修改。
2.函数模块(1)int InitiTable(int G[][MaxFarm],int num);//创建邻接表,返回值是农场数目{int j,k,TempValue;while(true){cout<<"请输入农场的数目:"<<' ';cin>>num;if(num<=MaxFarm&&num>0)break;cout<<"错误!请重新输入."<<endl<<endl;}for(j=0;j<num;j++){for(k=0;k<num;k++){if(j==k)G[j][k]=MaxWeight;else if(j<k){while(true){cout<<"请输入农场"<<j+1<<"至农场"<<k+1<<"的距离。
如果该路不存在请输入-1:"<<endl;cin>>TempValue;if(TempValue>=-1&&TempValue<MaxWeight) break;cout<<"输入无效,请重新输入。
最小耗费生成树Prim算法实验报告

学生实验报告学院:软件与通信工程学院课程名称:算法设计与分析专业班级:软件工程142班姓名:周平学号: 0143987学生实验报告一、实验综述实现贪心法的下列六个算法之一:1、可切割背包问题2、单源点最短路径求解算法——Dijkstra算法3、Dijkstra算法的改进版4、最小耗费生成树Kruskal算法5、最小耗费生成树Prim算法6、最小耗费生成树Prim算法的改进版要求与说明:1、各人独立完成,2、实验报告要求有:算法说明与描述、代码、数据集合(各算法1 要求达到百、千级)。
3、实验报告要有2-3个截图,包括导入数据、重要中间过程、最后结果等;4、额外完成所实现的算法,每完成一个加1 分;5、程序要求用C 语言完成,每个实验报告的代码都会被测试,对运行环境有特别要求的需要专门说明,否则,程序测试不通过责任自负;6、实验报告都有步骤分,但是,程序测试结果与实验报告结果不相符的,将被加重扣分;7、严禁抄袭——代码重复度超过90%者视作抄袭,抄袭者以0 分记,可以对评审提出质疑。
疑。
2、实验仪器、设备或软件1、个人电脑2、Microsoft Visual Studio 2015二、实验过程(实验步骤、记录、数据、分析)实验代码如下:#include<stdio.h>#include<stdlib.h>#define MAX 100#define MAXCOST 0x7fffffffint graph[MAX][MAX];int Prim(int graph[][MAX], int n){/* lowcost[i]记录以i为终点的边的最小权值,当lowcost[i]=0时表示终点i加入生成树 */ int lowcost[MAX];/* mst[i]记录对应lowcost[i]的起点,当mst[i]=0时表示起点i加入生成树 */int mst[MAX];int i, j, min, minid, sum = 0;/* 默认选择1号节点加入生成树,从2号节点开始初始化 */for (i = 2; i <= n; i++){/* 最短距离初始化为其他节点到1号节点的距离 */lowcost[i] = graph[1][i];/* 标记所有节点的起点皆为默认的1号节点 */mst[i] = 1;}/* 标记1号节点加入生成树 */mst[1] = 0;/* n个节点至少需要n-1条边构成最小生成树 */for (i = 2; i <= n; i++){min = MAXCOST;minid = 0;/* 找满足条件的最小权值边的节点minid */for (j = 2; j <= n; j++){/* 边权值较小且不在生成树中 */if (lowcost[j] < min && lowcost[j] != 0){min = lowcost[j];minid = j;}}/* 输出生成树边的信息:起点,终点,权值 */printf("%c - %c : %d\n", mst[minid] + 'A' - 1, minid + 'A' - 1, min);/* 累加权值 */sum += min;/* 标记节点minid加入生成树 */lowcost[minid] = 0;/* 更新当前节点minid到其他节点的权值 */for (j = 2; j <= n; j++){/* 发现更小的权值 */if (graph[minid][j] < lowcost[j]){/* 更新权值信息 */lowcost[j] = graph[minid][j];/* 更新最小权值边的起点 */mst[j] = minid;}}}/* 返回最小权值和 */return sum;}int main(){printf("请输入点数和边数:");int i, j, k, m, n;int x, y, cost;char chx, chy;scanf("%d%d", &m, &n);/* 读取节点和边的数目 */getchar();printf("请输入边的信息:");/* 初始化图,所有节点间距离为无穷大 */for (i = 1; i <= m; i++){for (j = 1; j <= m; j++){graph[i][j] = MAXCOST;}}/* 读取边信息 */for (k = 0; k < n; k++){scanf("%c %c %d", &chx, &chy, &cost);getchar();i = chx - 'A' + 1;j = chy - 'A' + 1;graph[i][j] = cost;graph[j][i] = cost;}/* 求解最小生成树 */cost = Prim(graph, m);/* 输出最小权值和 */printf("Total:%d\n", cost);//system("pause");return 0;}代码说明:1、2个for循环都是从2开始的,因为一般我们默认开始就把第一个节点加入生成树,因此之后不需要再次寻找它。
用Prim算法构造最小生成树

用Prim算法构造最小生成树班级:2010级计算机1班学号:2010131116 :才一、实验目的了解最小生成树的概念,掌握生成最小生成树的方法。
二、实验容建立一个含任意结点的无向连通网,并用Prim算法构造其最小生成树三、实验要点及说明如果无向连通图是一个网,则其所有生成树中必有一棵树的边的权值总和最小,这棵生成树为最小生成树。
Prim算法:在图G=(V,E)(V为顶点集,E为边集)中任选一顶点v0,令集合U={v0}为初态,在一个顶点在U中,另一顶点在V-U中的所有边中找权值最小的边(u,v)(U∈u,v∈V-U),并将v加入到U中,同时将边(u,v)加入集合T中(T的初态为空集),这样不断地扩大U,直至U=V,则集合T中的边为所求最小生成树的边四、算法思想与算法描述1、邻接矩阵的数据类型的定义如下:typedef struct{ int no; /*顶点编号*/string name; /*顶点其他信息*/} VertexType; /*顶点类型*/typedef struct/*图的定义*/{ int edges[MAXV][MAXV]; /*邻接矩阵*/int vexnum,arcnum; /*顶点数,弧数*/VertexType vexs[MAXV]; /*存放顶点信息*/}MGraph;2、临时数组的存放的数据类型struct {int closest; // U集中的顶点序号int lowcost; // 边的权值} closedge[MAXV];int const INF=32767; /*INF表示∞*/3、prime算法实现:(原理见实验说明)void prime(MGraph g,int v){int lowcost[MAXV];int min;int closest[MAXV];int i,j,k;for(i=0;i<g.vexnum;i++){lowcost[i]=g.edges[v][i];closest[i]=v;}for(i=1;i<g.vexnum;i++){min=INF;for(j=0;j<g.vexnum;j++)if(lowcost[j]!=0&&lowcost[j]<min){min=lowcost[j];k=j;}printf("边(%d,%d)权为:%d\n",closest[k],k,min);lowcost[k]=0;for(j=0;j<g.vexnum;j++)if(g.edges[k][j]!=0&&g.edges[k][j]<lowcost[j]){lowcost[j]=g.edges[k][j];closest[j]=k;}}}4、邻接矩阵的创建void CreatMGraph(MGraph &M){int n,e;cout<<"输入定点数:";cin>>n;M.vexnum=n;cout<<"输入弧数:";cin>>e;M.arcnum=e;for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i==j)M.edges[i][j]=0;elseM.edges[i][j]=INF;}}cout<<"输入边的权:(如1 2 3 表示点到点的权时)"<<endl; for(int i=0;i<2*e;i++){int x,y,z;cin>>x>>y>>z;M.edges[x][y]=z;}cout<<"输入点编号,名字:"<<endl;for(int i=0;i<n;i++){int No;string str;cin>>No>>str;M.vexs[i].name=str;M.vexs[i].no=No;}}int const MAXV=164、主函数int main(void){MGraph m;CreatMGraph(m);cout<<"输出无向图的二维矩阵:"<<endl;for(int i=0;i<m.vexnum;i++){for(int j=0;j<m.vexnum;j++){if(m.edges[i][j]==INF)cout<<" ";elsecout<<m.edges[i][j]<<" ";}cout<<endl;}cout<<"输入最小生成树:"<<endl;prime(m,0);return 0;}五、实验测试及结果1.输入图的定点数和边数2.输入邻矩阵:3.顶点编号级名字的输入:4.运行结果:六、总结与体会实验任务基本完成,加深队算法思想的认识附源码:#include<iostream> #include<string> using namespace std;int const MAXV=16;typedef struct{ int no; /*顶点编号*/string name; /*顶点其他信息*/} VertexType; /*顶点类型*/typedef struct/*图的定义*/{ int edges[MAXV][MAXV]; /*邻接矩阵*/int vexnum,arcnum; /*顶点数,弧数*/VertexType vexs[MAXV]; /*存放顶点信息*/}MGraph;struct {int closest; // U集中的顶点序号int lowcost; // 边的权值} closedge[MAXV];int const INF=32767; /*INF表示∞*/void prime(MGraph g,int v){int lowcost[MAXV];int min;int closest[MAXV];int i,j,k;for(i=0;i<g.vexnum;i++){lowcost[i]=g.edges[v][i];closest[i]=v;}for(i=1;i<g.vexnum;i++){min=INF;for(j=0;j<g.vexnum;j++)if(lowcost[j]!=0&&lowcost[j]<min){min=lowcost[j];k=j;}printf("边(%d,%d)权为:%d\n",closest[k],k,min);lowcost[k]=0;for(j=0;j<g.vexnum;j++)if(g.edges[k][j]!=0&&g.edges[k][j]<lowcost[j]){lowcost[j]=g.edges[k][j];closest[j]=k;}}}void CreatMGraph(MGraph &M){int n,e;cout<<"输入定点数:";cin>>n;M.vexnum=n;cout<<"输入弧数:";cin>>e;M.arcnum=e;for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i==j)M.edges[i][j]=0;elseM.edges[i][j]=INF;}}cout<<"输入边的权:(如1 2 3 表示点到点的权时)"<<endl;for(int i=0;i<2*e;i++){int x,y,z;cin>>x>>y>>z;M.edges[x][y]=z;}cout<<"输入点编号,名字:"<<endl;for(int i=0;i<n;i++){int No;string str;cin>>No>>str;M.vexs[i].name=str;M.vexs[i].no=No;}}int main(void){MGraph m;CreatMGraph(m);cout<<"输出无向图的二维矩阵:"<<endl;for(int i=0;i<m.vexnum;i++){for(int j=0;j<m.vexnum;j++){if(m.edges[i][j]==INF)cout<<" ";elsecout<<m.edges[i][j]<<" ";}cout<<endl;}cout<<"输入最小生成树:"<<endl;prime(m,0);return 0;}。
最小生成树数据结构实验报告

摘要最小生成树是数据结构中图的一种重要应用,在图中对于n个顶点的连通网可以建立许多不同的生成树,最小生成树就是在所有生成树中总的权值最小的生成树。
本课程设计是以邻接矩阵作为图的存储结构,分别采用Prim和Kruskal算法求最小生成树。
Kruskal算法和Prim算法是求最小生成树的常用算法它们分别适用于稠密图和稀疏图。
最小生成树的应用非常的广,如矿井通风设计和改造最优化方面以及如何搭建最短的网络线缆, 构建造价最低的通讯网络等等一系列的应用。
关键词:最小生成树,邻接矩阵,Kruskal算法,Prim算法目录一、引言 (3)二、设计目的与任务 (4)2.1课程设计目的 (4)2.2课程设计的任务 (4)三、设计方案 (4)3.1需求分析 (4)3.2数据结构分析 (4)3.2.1抽象数据类型(ADT)如下 (4)3.2.2基本操作 (5)3.2.3存储结构 (5)3.3最小生成树的算法分析 (7)3.3.1主函数模块代码......................... 错误!未定义书签。
3.3.2邻接矩阵定义模块代码 (7)3.3.3创建链接矩阵模块代码 (7)3.3.4最小生成树Prim算法及代价模块代码...... 错误!未定义书签。
3.3.5最小生成树kruskal算法及代价模块代码 (8)四、调试分析与体会 (9)五、运行结果 (10)六、结论 (16)七、参考文献 (16)一、引言《数据结构》是计算机科学与技术专业和信息管理与信息系统专业的必修课之一,是一门综合性的专业基础课。
本课程较系统地介绍了软件设计中常用的数据结构以及相应的实现算法,如线性表、栈、队列、树和二叉树,图、检索和排序等,并对性能进行分析和比较,内容非常丰富。
本课程设计我们要解决的问题是图最小生成树问题。
要用到图的先相关数据结构和求最小生成树的两种数据结构算法普里姆算法和克鲁斯卡尔算法,以及储存图的边和点的邻接矩阵。
最小生成树实验报告

最小生成树实验报告最小生成树实验报告引言:最小生成树是图论中一个重要的概念,它在许多实际问题中都有广泛的应用。
本次实验旨在通过实际操作,深入理解最小生成树的概念、算法及其在实际问题中的应用。
本文将从实验的目的、实验过程、实验结果及分析等方面进行详细的论述。
实验目的:1. 理解最小生成树的概念及其在实际问题中的应用;2. 掌握最小生成树的两种常用算法:Prim算法和Kruskal算法;3. 通过实际操作,加深对最小生成树算法的理解。
实验过程:1. 实验环境的搭建:首先,我们需要在计算机上搭建一个图论实验环境。
选择一门编程语言,如Python,来实现最小生成树算法。
通过安装相应的开发环境和图论库,我们可以方便地进行实验。
2. 数据的准备:为了进行最小生成树的实验,我们需要准备一组具有权值的图数据。
可以通过手动输入或从文件中读取的方式获取数据。
确保数据的合理性和完整性,以便进行后续的实验操作。
3. Prim算法的实现:Prim算法是一种贪心算法,用于求解最小生成树。
在实验中,我们需要实现Prim算法,并将其应用于准备好的图数据上。
通过编程实现,我们可以得到Prim算法生成的最小生成树。
4. Kruskal算法的实现:Kruskal算法是另一种常用的最小生成树算法。
与Prim算法不同,Kruskal算法是一种基于边的贪心算法。
同样地,我们需要实现Kruskal算法,并将其应用于准备好的图数据上,以获得Kruskal算法生成的最小生成树。
实验结果与分析:通过实验,我们得到了Prim算法和Kruskal算法生成的最小生成树。
我们可以将这两个结果进行对比和分析,以进一步理解这两种算法的特点和应用场景。
首先,我们可以比较两个算法生成的最小生成树的权值。
通过计算权值的总和,我们可以确定哪个算法生成的最小生成树更优。
此外,我们还可以比较两个算法生成的最小生成树的结构,观察它们是否存在差异。
其次,我们可以分析两个算法的时间复杂度和空间复杂度。
Prim算法求最小生成树

算法分析与设计实验报告第次实验}最小生成树N=4:最小生成树N=5:最小生成树N=6:通过本次实验明白了最小生成树贪心算法的设计思路,掌握了prim算法附录:完整代码#include<iostream>#include <stdio.h>#include <time.h>#include <iomanip>#include <string.h>#define MaxInt 0x3f3f3f3f#define N 110using namespace std;//创建map二维数组储存图表,low数组记录每2个点间最小权值,visited数组标记某点是否已访问int map[N][N],low[N],closest[N],visited[N];int n;int prim(){int i;int min=MaxInt,result=0;memset(visited,0,sizeof(visited));visited[1]=1;//从某点开始,分别标记和记录该点for(i=2;i<=n;i++){low[i]=map[1][i];//给low数组赋值closest[i]=1;visited[i]=0;}for(i=1;i<n;i++)//运行n-1次{//找出最小权值并记录位置min=MaxInt;int k=1;for(int j=2;j<=n;j++)if(visited[j]==0&&min>low[j]){min=low[j];k=j;cout<<k<<"与"<<closest[k]<<"相连"<<endl;}result+=min;//最小权值累加visited[k]=1;//标记该点for(int j=2;j<=n;j++)//更新权值if(visited[j]==0&&low[j]>map[k][j]){low[j]=map[k][j];closest[j]=k;}}return result;}int main(){int i,p=0;double k=0.0;clock_t start,end,over;start=clock(); end=clock();over=end-start;start=clock();int v,j,ans;cout<<"(以EOF为程序结束符)输入顶点数n:";while(scanf("%d",&n)!=EOF){cout<<"输入n*n的权值矩阵:"<<endl;memset(map,MaxInt,sizeof(map));//所有权值初始化为最大for(i=1;i<=n;i++)for(j=1;j<=n;j++){cin>>v;map[i][j]=v;}ans=prim();cout<<"最小生成树的权值之和为:"<<ans<<endl;for(i=0;i<1000000000;i++) p=p+i;end=clock();printf("The time is %6.3f",(double)(end-start-over)/CLK_TCK);}return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
黄冈师范学院提高型实验报告实验课题最小生成树的Prim算法(实验类型:□综合性■设计性□应用性)实验课程算法程序设计实验时间 2010年12月24日学生姓名周媛鑫专业班级计科 0801学号 200826140110一.实验目的和要求(1)根据算法设计需要, 掌握连通网的灵活表示方法;(2)掌握最小生成树的Prim算法;(3)熟练掌握贪心算法的设计方法;二.实验条件(1)硬件环境:实验室电脑一台(2)软件环境:winTC三.实验原理分析(1)最小生成树的定义:假设一个单位要在n个办公地点之间建立通信网,则连通n个地点只需要n-1条线路。
可以用连通的无向网来表示n个地点以及它们之间可能设置的通信线路,其中网的顶点表示城市,边表示两地间的线路,赋于边的权值表示相应的代价。
对于n个顶点的连通网可以建立许多不同的生成树,每一棵生成树都可以表示一个通信网。
其中一棵使总的耗费最少,即边的权值之和最小的生成树,称为最小生成树。
(2)构造最小生成树可以用多种算法。
其中多数算法利用了最小生成树的下面一种简称为MST的性质:假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。
若(u,v)是一条具有最小权值(代价)的边,其中u∈U,v∈V-U,则必存在一棵包含边 (u.v)的最小生成树。
(3)普里姆(Prim)算法即是利用MST性质构造最小生成树的算法。
算法思想如下:假设N=(V,{E})和是连通网,TE是N上最小生成树中边的集合。
算法从U={u0}( u0∈V),TE={}开始,重复执行下述操作:在所有u∈U,v∈V-U的边(u, v) ∈E 中找一条代价最小的边(u0, v0)并入集合TE,同时v0并入U,直到U=V为止。
此时TE中必有n-1条边,则T=(V,{TE})为N的最小生成树。
四.实验步骤(1)数据结构的设计:采用邻接矩阵的存储结构来存储无向带权图更利于实现及操作:邻接矩阵的抽象数据结构定义:#define INFINITY INT_MAX //最大值#define MAX_ERTEX_NUM 20 //最大顶点数typedef enum {DG,DN,UDG,UDN}GraphKind;//{有向图,有向网,无向网,无向图} typedef struct Arc Cell{VRType adj ; // VRType 是顶点关系的类型。
对无权图用1和0表示相邻否;InfoType * info; //该弧相关信息的指针}ArcCell ,AdjMatrix [ MAX_VERTEX_NUM][MAX_VERTEX_NUM];Typedef struct {VertexType vexs [ MAX_VERTEX_NUM] ; //顶点向量AdjMatrix arcs ; // 邻接矩阵int vexnum , arcnum ; //图的当前顶点数和弧数GraphKind kind ; // 图的种类标志}Mgraph ;(2)函数设计函数名称函数原型功能描述main() int main(void) 系统调用主函数Huiru() void Huitu () 绘制无向图GraphicVer() void GraphicVer(Graph *G) 输出邻接矩阵prim() void prim(Graph *G) PRIM算法演示(3)实验源代码#include<graphics.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <conio.h>#define MaxVertexNum 50#define INF 32767typedef struct Graphic{char vexs[MaxVertexNum];int edges[MaxVertexNum][MaxVertexNum];int v,e;}Graph;char tmp[10];void Huitu() /*无向图的图形生成*/{char buffer[100];int graphdriver = DETECT, graphmode;int i,xbefore,ybefore;int x1,y1; char c;/*registerbgidriver(EGAVGA_driver);initgraph(&graphdriver, &graphmode, ""); cleardevice();printf("input pot (300<x<610,y<400):\ninput 0 to halt!\n");setfillstyle(1,WHITE);setcolor(WHITE);scanf("%d,%d,%s",&xbefore,&ybefore,buffer);circle(xbefore,ybefore,15);floodfill(xbefore,ybefore,WHITE);setcolor(BLUE);outtextxy(xbefore, ybefore, buffer);setcolor(WHITE);moveto(xbefore,ybefore);while(1){scanf("%d,%d,%s",&x1,&y1,buffer);if(x1==0) break;circle(x1,y1,15);floodfill(x1,y1,WHITE);setcolor(BLUE);outtextxy(x1, y1, buffer);setcolor(WHITE);line(xbefore,ybefore,x1,y1);xbefore=x1;ybefore=y1;}system("pause");}void GraphicVer(Graph *G) /*build and output the adjMatrix*/ {int i,j,k,weight;int v1,v2;printf("input vertex's and edges's number :");scanf("%d,%d",&G->v,&G->e);for(i=1;i<=G->v;i++)for(j=1;j<=G->v;j++)if(i==j) G->edges[i][j]=0;else{ G->edges[i][j]=INF;}for(k=1;k<=G->e;k++){printf("input %dth edge :",k);scanf("%d,%d,%d",&v1,&v2,&weight);G->edges[v1][v2]=G->edges[v2][v1]=weight;}for(i=1;i<=G->v;i++){printf("\n");for(j=1;j<=G->v;j++)printf((G->edges[i][j]==INF)?"∞\t":"%d\t",G->edges[i][j]); } printf("\n");system("pause");}/***************prim 算法生成最小生成树***************/void prim(Graph *G){int lowcost[MaxVertexNum],closest[MaxVertexNum];int i,j,k,min;for(i=2;i<=G->v;i++) /*n个顶点,n-1条边 */ {lowcost[i]=G->edges[1][i];closest[i]=1;}lowcost[1]=0; /*标志顶点1加入U集合*/for(i=2;i<=G->v;i++) /*形成n-1条边的生成树 */ {min=INF; k=0;for(j=2;j<=G->v;j++)if((lowcost[j]<min)&&(lowcost[j]!=0)){min=lowcost[j]; k=j;}printf("(%d,%d)%2d\t",closest[k],k,min);lowcost[k]=0; /*顶点k加入U*/for(j=2;j<=G->v;j++) /*修改由顶点k到其他顶点边的权值*/ if(G->edges[k][j]<lowcost[j]){lowcost[j]=G->edges[k][j];closest[j]=k;}printf("\n");} }void drawwapicture(int lowcost[],int closest[],int vex){ int i=0,x=0,datax=0;setviewport(150,140,630,310,1);cleardevice();setcolor(GREEN);rectangle(10,10,470,160);line(10,60,470,60);line(10,110,470,110);for(i=0;i<vex;i++){x=470-40*i;datax=470-20*i;line(x,10,x,160);if((vex-i)!=0){outtextxy(datax,35,"(vex-i)\0");vsprintf(tmp,"%d",&lowcost[vex-i]);outtextxy(datax,85,tmp);vsprintf(tmp,"%d",&closest[vex-i]);outtextxy(datax,135,tmp);}else{outtextxy(datax,35,"i\0");outtextxy(datax,85,"lowcost\0");outtextxy(datax,135,"closest\0");}}getche();closegraph();}/***************prim 算法生成最小生成树***************/void primyanshi(Graph *G){ void drawwapicture(int *p,int*q,int k);int lowcost[MaxVertexNum],closest[MaxVertexNum];int i,j,k,min;cleardevice();for(i=2;i<=G->v;i++) /*n个顶点,n-1条边 */ { lowcost[i]=G->edges[1][i]; /*初始化*/closest[i]=1; } /*顶点未加入到最小生成树中 */ drawwapicture(lowcost,closest,G->v);lowcost[1]=0; drawwapicture(lowcost,closest,G->v);for(i=2;i<=G->v;i++) /*形成n-1条边的生成树 */ {min=INF; k=0;for(j=2;j<=G->v;j++)if((lowcost[j]<min)&&(lowcost[j]!=0)){min=lowcost[j];k=j;}drawwapicture(lowcost,closest,G->v);cprintf("(%d,%d)%2d\t",closest[k],k,min);lowcost[k]=0; /*顶点k加入U*/drawwapicture(lowcost,closest,G->v);for(j=2;j<=G->v;j++) /*修改由顶点k到其他顶点边的权值*/if(G->edges[k][j]<lowcost[j]){lowcost[j]=G->edges[k][j];closest[j]=k;}drawwapicture(lowcost,closest,G->v);printf("\n");}}int main(){Graph *G=NULL;int flag=1;printf("//****************************************************//\n"); printf("//************Welcome to the world of IRIS************//\n"); printf("/********************************200826140110********//\n"); while(flag!=0){printf("1:Build a Undigraph Net and output the adjMatrix.\n");printf("2.Output the Mini_tree:\n");printf("3.Display the procession of Mini_tree with PRIM:\n");printf("4.exit:\n");scanf("%d",&flag);switch(flag){printf("%d",flag);case 1:Huitu();GraphicVer(G);break;case 2:prim(G);break;case 3: primyanshi(G);break;default :printf("Thank you!\n");system("pause");exit(0);}}printf("Thank you!\n");system("pause"); return 0;}五.实验结果分析六.实验小结通过此次实验后我深刻地学习了最小生成树的Prim算法,通过分析实验目的和实验内容;阐述不同方法的原理;分析不同方法的特点和区别以及时空复杂度;分析和调试测试数据和相应的结果.明白了Prim算法是设计思想:设图G =(V,E),其生成树的顶点集合为U。