问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

普里姆算法

发布网友 发布时间:2022-04-23 02:16

我来回答

1个回答

热心网友 时间:2023-09-28 01:48

测试结果:

6 10
123456
0 1 6
0 2 1
0 3 5
1 2 5
1 4 3
2 3 5
2 4 6
2 5 4
3 5 2
4 5 6
1---3 1
3---6 4
6---4 2
3---2 5
2---5 3


//图 最小生成树 Prim算法

#include "stdio.h"
#include "stdlib.h"

#define MAXVEX 200
#define INFINITY 65535

typedef struct
{
    char vexs[MAXVEX];         //顶点
int arc[MAXVEX][MAXVEX];   //边的权值
int numVertexes;           //顶点总数
int numEdges;              //边的总数
}MGraph;

void CreateMGraph(MGraph *G)/* 构件图 */
{
    char str[200];
    int beginVert,endVert,weight;
int i, j;

    //输入顶点总数,边的总数
scanf("%d%d",&i,&j);
G->numVertexes=i;
G->numEdges=j;

    //输入顶点符号
scanf("%s",str);

for(i = 0; i < G->numVertexes; i++)
    {
        G->vexs[i]=str[i];
    }

for(i = 0; i < G->numVertexes; i++)/* 初始化图 */
{
for( j = 0; j < G->numVertexes; j++)
{
if (i==j)
            {
                G->arc[i][j]=0;
            }
else
            {
                G->arc[i][j] = G->arc[j][i] = INFINITY;
            }
}
}
    //输入所有边的权值
for(i = 0; i < G->numEdges; i++)
    {
        scanf("%d%d%d",&beginVert,&endVert,&weight);
        G->arc[beginVert][endVert]=weight;
    }

for(i = 0; i < G->numVertexes; i++)
{
for(j = i; j < G->numVertexes; j++)
{
G->arc[j][i] =G->arc[i][j];
}
}
}

/* Prim算法生成最小生成树  */
void MiniSpanTree_Prim(MGraph G)
{
int min, i, j, k;
int adjvex[MAXVEX];/* 保存相关顶点下标 */
int lowcost[MAXVEX];/* 保存相关顶点间边的权值 */
char beginVert,endVert;

lowcost[0] = 0;/* 初始化第一个权值为0,即v0加入生成树 */
    /* lowcost的值为0,在这里就是此下标的顶点已经加入生成树 */
adjvex[0] = 0;/* 初始化第一个顶点下标为0 */
for(i = 1; i < G.numVertexes; i++)/* 循环除下标为0外的全部顶点 */
{
lowcost[i] = G.arc[0][i];/* 将v0顶点与之有边的权值存入数组 */
adjvex[i] = 0;/* 初始化都为v0的下标 */
}
for(i = 1; i < G.numVertexes; i++)
{
min = INFINITY;/* 初始化最小权值为∞, */
/* 通常设置为不可能的大数字如32767、65535等 */
j = 1;k = 0;
while(j < G.numVertexes)/* 循环全部顶点 */
{
if(lowcost[j]!=0 && lowcost[j] < min)/* 如果权值不为0且权值小于min */
{
min = lowcost[j];/* 则让当前权值成为最小值 */
k = j;/* 将当前最小值的下标存入k */
}
j++;
}

beginVert=G.vexs[adjvex[k]];
endVert=G.vexs[k];
//打印当前顶点边中权值最小的边
printf("%c---%c %d\n", beginVert, endVert, min);

lowcost[k] = 0;/* 将当前顶点的权值设置为0,表示此顶点已经完成任务 */
for(j = 1; j < G.numVertexes; j++)/* 循环所有顶点 */
{
if(lowcost[j]!=0 && G.arc[k][j] < lowcost[j])
{   //如果下标为k顶点各边权值小于此前这些顶点未被加入生成树权值
lowcost[j] = G.arc[k][j]; //将较小的权值存入lowcost相应位置
adjvex[j] = k;  //将下标为k的顶点存入adjvex
}
}
}
}

int main(void)
{
MGraph G;
CreateMGraph(&G);
MiniSpanTree_Prim(G);

return 0;

}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2024年欧洲杯赛程表 德国欧洲杯足球赛2024赛程时间表 勇者斗魔王勇者斗恶龙12Gameboy游戏1中最后魔王变身后怎么打2中什么武... 电脑开机十秒技巧怎样让电脑开机速度变快 完美世界手游熊猫哪里抓完美国际熊猫是怎么得的 ...每一关跳旗杆的时候怎么才能跳到满分我每次都只能跳到 ip11和ip11pro区别 请问;谁知道SJ-M里面有一个叫基_什么? 智齿疼一定要拔吗 大师们帮我算算我的命数!不胜感激~ 怎样选择评估公司 普洱茶一般在哪里买更好 # include &lt;reg51.h&gt; #define uchar unsigned char #define uint unsigned int uint a,b,c,d,e,f; &#47;*a为舵 iphone12怎么连接小米手环 数据结构题目求大神 小米note手机怎样查看私密相册? 卖普洱茶网站哪家好? 17款E320L原地打舵 车身不动因为什么E300原地打舵车身都有倾斜角度 我的车有什么毛病吗? iphone6的蓝牙无法搜索到小米手环2,蓝牙设备发现不了,为什么? 怎么用c语言生成一个固定顶点数和固定边数的无向图 小米手机怎样私密相册 我们想从网上买点正宗的普洱茶,不知道是哪家的好?还有普洱茶属于什么茶啊?我们想多了解点 关于数据结构中最短路径问题 小米手机怎样设置隐私相册 如何为结构体中的2维数组初始化typedef struct { int vexs[num]; int arcs[2][2]; }Mgraph; 如何从网上购买普洱茶?选择普洱茶时候要注意什么? 如何用苹果手机登录小米手环2? 想要问问在网上可以买到可靠一点的普洱茶吗? 小米手环2可以和苹果手机连接吗 如何用文件保存图的顶点,编号,描述和边等信息(C语言代码) 普洱茶如何从网上买? 小米Note手机里的照片设置为私密后如何找到? 请问我怎么才能买到普洱茶烟 苹果6S手机如何重新配对被忽略了的小米手环2? 无向网的邻接矩阵,怎么不能正确输出? 小米note全网通手机怎么加密相册 小米手环如何跟iPhone手机连接 网上哪里买普洱茶靠谱点?大神们帮帮忙 哈密尔顿图遍历 小米私密相册怎么找 小米手环2的解锁能够在iphone上用吗 如何在网上购买茶叶? 最小生成树怎么求 小米note8pro私密照片怎么打开? 苹果手机怎么和小米手环怎么连接 在网上买普洱茶在哪里比较好,淘宝还是网站? 小米note照片设为私密照片怎么打开 数据结构——图 怎么购买普洱茶 小米手环怎么连接iPhone手机的健康应用? 数据结构最小生成树问题