c语言图的最短路径Prim算法

本文介绍了如何使用C语言实现Prim算法找到图的最短路径。通过临接矩阵表示图,创建mst和lowcast数组记录顶点连接状态和最小权值,并从A点开始逐步扩展,标记已访问节点并更新最小权值,最终找出最短路径。
摘要由CSDN通过智能技术生成

图的最短路径Prim算法

图样式如图所示
我们将用临接矩阵来表示该图(具体代码将在思路构思下面显示)。

  1. 创建mst数组
    mst[0]、 mst[1]、 mst[2]、 mst[3]、 mst[4]、 mst[5]。
    mst[0]代表A、mst[1]代表B、mst[2]代表C、mst[3]代表D、mst[4]代表E、mst[5]代表F、
    例如:
    mst[0] = 1,的意思是A顶点与B顶点的边相连接,
    mst[1] = 2,的意思是B顶点与C顶点的边相连接。(以此类推)
    0 1 2 3 4 5
    A B C D E F

  2. 创建lowcast数组
    lowcast[0]、lowcast[1]、lowcast[2]、lowcast[3]、lowcast[4]、lowcast[5]。
    例如:
    lowcast[0]=5,的意思是mst[0](即A与其连接顶点的边)的值为 5;
    lowcast[1]=9,的意思是mst[1](即B与其连接顶点的边)的值为 9;(以此类推)

  3. 我们将开始从A点开始进行寻找(*代表无穷大代表两个节点之间没有连接线路)
    初始化

    A----->C 权值为1:
    在这里插入图片描述

从A节点出发寻找每个节点与A节点的距离,随后寻找lowcast数组中最小的一个即lowcast[2]=1,随后将mst[2]的值赋值为-1代表该节点已经被使用,在随后的比较中将不再对mst[2]进行比较
在这里插入图片描述
随后我们将查找各边以A、C顶点相连接中最小的边,由于C顶点的加入lowcast数组和mst数组也要发生改变。(将未标记mst[i]=-1的顶点与A,C顶点连接的边的最小值加入到lowcast和mst数组中)

注意:红色代表已经访问的节点后续不参与比较,紫色代表本轮查询到的最小值,白色代表还未添加的节点

将C顶点标记为已访问,C----->F权值为4
在这里插入图片描述
将F顶点标记为已访问,F----->D权值为2

在这里插入图片描述
将B顶点标记为已访问,C----->B权值为5
在这里插入图片描述

将E顶点标记为已访问,B----->E权值为3
在这里插入图片描述

最终绿色的线代表最短的路径
在这里插入图片描述

//头文件
//依据邻接矩阵来实现,所以包含了邻接矩阵的创建删除等方法
#pragma once
#include<stdio.h>
#include<malloc.h>
#include<assert.h>

#define Default_Vertex_Size  10

#define T char
#define E int
#define MAX_COST  0x7FFFFFFF

typedef struct GraphMtx
{
   
	int MaxVertices;
	int NumVertices;
	int NumEdges;

	T   *VerticesList;
	int **Edge;
}GraphMtx;

void InitGraph(GraphMtx *g);
int  GetVertexPos(GraphMtx *g, T v);
void ShowGraph(GraphMtx *g);
void InsertVertex(GraphMtx *g, T v);
void InsertEdge(GraphMtx *g, T v1, T v2, E cost);
void RemoveVertex(GraphMtx *g, T v);
void RemoveEdge(GraphMtx *g, T v1, T v2);
void DestroyGraph(GraphMtx *g);
int  GetFirstNeighbor(GraphMtx *g, T v);
int  GetNextNeighbor(GraphMtx *g, T v, T w);

E    GetWeight(GraphMtx *g, int v1, int v2);
void MinSpanTree_Prim(GraphMtx *g, T vertex);
//邻接矩阵的方法实现,以及Prim算法的实现
#include"GraphMtx.h"
//初始化
void InitGraph(GraphMtx *g)
{
   
	g->MaxVertices = Default_Vertex_Size;
	g->NumVertices = g->NumEdges = 0;

	g->VerticesList = (T*)malloc(sizeof(T)*(g->MaxVertices));
	assert(g->VerticesList != NULL);

	g->Edge = (int**)malloc(sizeof(int*) * g->MaxVertices);
	assert(g->Edge != NULL);
	for(int i=0; i<g->MaxVertices; ++i)
	{
   
		g->Edge[i] = (int*)malloc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜须昆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值