数据结构——图-迪杰斯特拉算法

问题描述
将图以邻接矩阵或邻接表存储,实现Dijkstra算法。

算法设计
迪杰斯特拉算法:

1.假设用带权的邻接矩阵arc,来表示带权有向图,arc[i][j],表示弧<vi,vj>上的权值。若<vi,vj>不存在,则置arc[i][j]为无穷。
S为已找到从v出发的最短路径的终点的集合,它的初始状态为空集。那么,从v出发到图上其余各顶点可能达到的最短路径长度的初值为:
D[j]=arcs[LocateVex(G,v)][i] vi∈V

2.选择vj,使得 D[j]=Min{D[i]|vi∈V-S}
vj就是当前求得的一条从v出发的最短路径的终点。令S=S∪{j}

3.修改从v出发到集合V-S上任一顶点vk可达的最短路径长度。如果
D[j]+arcs[j][k]<D[k] 则修改D[k]为D[k]=D[j]+arcs[j][k]

4.重复操作2,3共n-1次。
由此求得从v到图上其余各顶点的最短路径是依路径长度递增的序列。

在这里插入图片描述

在这里插入图片描述

#include<stdio.h>
#include<string.h>
#define INF 32767
#define MAXVEX 30
int dist[MAXVEX];		 //建立dist数组int path[MAXVEX];		 //建立path数组int S[MAXVEX];		 //建立S数组typedef char VertexType;typedef struct graph
{int n,e;VertexType vexs[MAXVEX];int edges[MAXVEX][MAXVEX];
}MGraph;void CreateMGraph(MGraph &G)
{int n,e;int value;char temp_i;char temp_j;printf("请输入图的顶点数和边数(以空格分隔):");scanf("%d%d",&n,&e);G.n=n;G.e=e;for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(i==j)G.edges[i][j]=0;elseG.edges[i][j]=32767;}}printf("输入顶点信息:");for(int j=0;j<G.n;j++){getchar();scanf("%c",&G.vexs[j]);}int temp_number_i;int temp_number_j;printf("请输入每条边的权值:\n");for(int j=0;j<e;j++){getchar();scanf("%c %c %d",&temp_i,&temp_j,&value);for(int i=0;i<n;i++){if(G.vexs[i]==temp_i)temp_number_i=i;if(G.vexs[i]==temp_j)temp_number_j=i;}G.edges[temp_number_i][temp_number_j]=value;}}void DispMGraph(MGraph &G)
{printf("输出顶点信息:\n");for(int i=0;i<G.n;i++){printf("%c",G.vexs[i]);} printf("\n输出邻接矩阵:\n");printf("\t");for(int i=0;i<G.n;i++)printf("%8c",G.vexs[i]); for(int i=0;i<G.n;i++){printf("\n%8c",G.vexs[i]);for(int j=0;j<G.n;j++){if(G.edges[i][j]==32767) //两点之间无连接时权值为默认的32767,// 在无向图中一般用"0"表示,在有向图中一般用"∞",// 这里为了方便统一输出 "∞"printf("%8s", "∞");elseprintf("%8d",G.edges[i][j]);}printf("\n");}
}void Dijkstra(MGraph g, int v)
{  //求从v到其他顶点的最短路径int mindis,i,j,u=0;for (i=0;i<g.n;i++){	dist[i]=g.edges[v][i]; //距离初始化S[i]=0;			 //S[]置空if (g.edges[v][i]<INF) //路径初始化path[i]=v;		 //v→i有边时,置i前一顶点为velse			 //v→i没边时,置i前一顶点为-1path[i]=-1;}S[v]=1;			//源点编号v放入S中for (i=0;i<g.n-1;i++)	//循环向S中添加n-1个顶点{  mindis=INF;		//mindis置最小长度初值for (j=0;j<g.n;j++)	//选取不在S中且有最小距离顶点uif (S[j]==0 && dist[j]<mindis) {  u=j;mindis=dist[j];}S[u]=1;			//顶点u加入S中for (j=0;j<g.n;j++)	//修改不在s中的顶点的距离if (S[j]==0)if (g.edges[u][j]<INF&& dist[u]+g.edges[u][j]<dist[j]){  dist[j]=dist[u]+g.edges[u][j];path[j]=u;}}
}void Print(MGraph G,int v)
{printf("\n");for(int i=0;i<G.n;i++){if(i!=v && dist[i]!=INF){printf("%c到%c的最短距离为:%d\n",G.vexs[v],G.vexs[i],dist[i]);}else if(dist[i]==INF){printf("%c与%c之间无路径!\n",G.vexs[v],G.vexs[i]); } }printf("\n"); 
}/*------------------输出从顶点v出发的所有最短路径-------------------*/
static void Dispath(MGraph g, int v)
{int i, j, k;int apath[MAXVEX], d;                         //存放一条最短路径(逆向)及其顶点个数//循环输出从顶点v到i的路径for(i = 0; i < g.n; i++){if(S[i] == 1 && i != v){printf("从顶点%c到顶点%c的路径长度为:%d\t路径为:", g.vexs[v], g.vexs[i], dist[i]);d = 0; apath[d] = i;                //添加路径上的终点k = path[i];if(k == -1)                         //没有路径的情况printf("无路径\n");else                                //存在路径时输出该路径{while(k != v){d++;apath[d] = k;k = path[k];}d++; apath[d] = v;              //添加路径上的起点printf("%c ",  g.vexs[apath[d]]);         //先输出起点for(j = d - 1; j >= 0; j--)     //再输出其余顶点printf("  %c ", g.vexs[apath[j]]);printf("\n");}}}
}int main()
{MGraph G;CreateMGraph(G);DispMGraph(G);Dijkstra(G,0);Print(G,0);Dispath(G,0);
}

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306770.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单体 soa 微服务 区别_漫谈何时从单体架构迁移到微服务?

面对微服务如火如荼的发展&#xff0c;很多人都在了解&#xff0c;学习希望能在自己的项目中帮得上忙&#xff0c;当你对微服务的庐山真面目有所了解后&#xff0c;接下来就是说服自己了&#xff0c;到底如何评估微服务&#xff0c;什么时候使用微服务&#xff0c;什么时间点最…

2020了,最流行的密码依旧是123456

喜欢就关注我们吧&#xff01;密码管理器 NordPass 于日前发布的一份报告中揭示了 2020 年最常见的密码&#xff0c;并提供了有关如何使密码更安全的建议。根据 NordPass 的研究&#xff0c;在今年 200 种最常用的密码中&#xff0c;“123456”位居第一&#xff0c;有 250 万人…

计算机二级和英语四六级是同一个账号吗,英语四六级考试和计算机考试的登录账号和密码一样吗?我好像混了,但是密码一直输不对,...

两个密码都记得直接试就出来了非常的简单&#xff0c;如果实在不行的话重置一下大学英语六级考试(又称CET-6&#xff0c;全称为“College English Test-6”)是由国家统一出题的&#xff0c;统一收费&#xff0c;统一组织考试&#xff0c;用来评定应试人英语能力的全国性的考试&…

C# 中的本地函数

今天我们来聊一聊 C# 中的本地函数。本地函数是从 C# 7.0 开始引入&#xff0c;并在 C# 8.0 和 C# 9.0 中加以完善的。引入本地函数的原因我们来看一下微软 C# 语言首席设计师 Mads Torgersen 的一段话&#xff1a;Mads Torgersen&#xff1a;我们认为这个场景是有用的 —— 您…

数据结构——图-有向图和无向图的邻接表基础

#include <stdio.h> #include <stdlib.h> #define VertexType char //顶点的数据类型&#xff08;char&#xff09; #define VertexMax 20 //最大顶点个数 typedef struct ArcNode//边表 {int adjvex;//存储的是该顶点在顶点数组即AdjList[]中的位置 struct ArcN…

2019山科计算机专业分数线,2019山东科技大学研究生分数线汇总(含2016-2019历年复试)...

2019山东科技大学研究生分数线(含2016-2019历年复试)考研就是人生的第二次高考&#xff0c;是再一次改变自己命运的机会&#xff0c;所谓7分靠努力&#xff0c;3分靠填报&#xff0c;山东科技大学历年研究生复试分数线是2019-2020届考研学子十分关心的问题&#xff0c;以下是如…

b+树时间复杂度_第15期:索引设计(索引组织方式 B+ 树)

谈到索引&#xff0c;大家并不陌生。索引本身是一种数据结构&#xff0c;存在的目的主要是为了缩短数据检索的时间&#xff0c;最大程度减少磁盘 IO。任何有数据的场景几乎都有索引&#xff0c;比如手机通讯录、文件系统(ext4xfsfs)、数据库系统(MySQLOracle)。数据库系统和文件…

结合控制台程序和K8S的CronJob完成定时任务

前言 老黄前段时间遇到了一个数据清洗的需求&#xff0c;其实就是每天凌晨把昨天的数据清洗一遍&#xff0c;归归类。这是一个比较典型的定时任务的处理场景。定时任务可以说就一把利器&#xff0c;几乎每个公司都离不开&#xff0c;它的应用场景也不在少数&#xff0c;比如&am…

数据结构——图-有向带权图的邻接表基础

#include <stdio.h> #include <stdlib.h> #define VertexType char //顶点的数据类型&#xff08;char&#xff09; #define VertexMax 20 //最大顶点个数 typedef struct ArcNode//边表 {int adjvex;//存储的是该顶点在顶点数组即AdjList[]中的位置int weight; …

vs里面mfc是什么_最近!一大批人正在前往文安,究竟发生了什么?

阅读本文前&#xff0c;请您先点击上面蓝色字体“文安家乡群”再点击“关注”&#xff0c;这样您就可以加入文安家乡群了。最近&#xff0c;文安的火车站汽车站&#xff0c;来了一大批外地人&#xff0c;挤爆了文安车站…究竟发生了什么事儿&#xff1f;让这么多人蜂拥而至&…

html 去除max-height,HTML Style maxHeight用法及代码示例

maxHeight属性设置/返回元素的最大高度。 maxHeight属性仅影响block-level元素&#xff0c;绝对或固定位置元素。用法:它用于设置maxHeight属性&#xff1a;object.style.maxHeight "none|length|%|initial|inherit"它用于返回maxHeight属性&#xff1a;object.styl…

数据结构——图-有向带权图的邻接表

#include <stdio.h> #include <stdlib.h> #define VertexType char //顶点的数据类型&#xff08;char&#xff09; #define VertexMax 20 //最大顶点个数 typedef struct ArcNode//边表 {int adjvex;//存储的是该顶点在顶点数组即AdjList[]中的位置int weight; …

ASP.NET Core使用HostingStartup增强启动操作

概念在ASP.NET Core中我们可以使用一种机制来增强启动时的操作&#xff0c;它就是HostingStartup。如何叫"增强"操作&#xff0c;相信了解过AOP概念的同学应该都非常的熟悉。我们常说AOP使用了关注点分离的方式&#xff0c;增强了对现有逻辑的操作。而我们今天要说的…

计算机网络实验arp协议分析,计算机网络ARP地址协议解析实验报告

计算机网络ARP地址协议解析实验报告 (5页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;9.9 积分计算机网络实验报告、实验目的:1. 掌握ARP协议的报文格式2. 掌握ARP协议的工作原理3. 理解ARP高速缓存…

数据结构——图-最短路径长度中最大的一个

#include<stdio.h> #include<string.h> #define INF 32767 #define MAXVEX 30 int dist[MAXVEX]; //建立dist数组int path[MAXVEX]; //建立path数组int S[MAXVEX]; //建立S数组typedef char VertexType;typedef struct graph {int n,e;VertexType vexs[MAXVE…

一个情怀引发的生产事故

在一个项目中&#xff0c;需要轻量级用到脚本语言&#xff0c;来提高应用服务的灵活性。因为知道Roslyn可以动态编辑C#&#xff0c;本着情怀&#xff0c;就自然用Roslyn来处理这块业务了。开在windows上执行&#xff0c;一次调用风平浪静&#xff0c;因为这个功能使用频次不高&…

python standardscaler_教你用python一步步解决“维度灾难”

全文共7016字&#xff0c;预计学习时长40分钟或更长现代科技时代产生和收集的数据越来越多。然而在机器学习中&#xff0c;太多的数据可不是件好事。某种意义上来说&#xff0c;特征或维度越多&#xff0c;越会降低模型的准确性&#xff0c;因为需要对更多的数据进行泛化——这…

c++的输入和输出

1. 输入/输出流的成员函数 put()函数 put函数常用的调用形式&#xff1a; cout.put(char ch); 功能&#xff1a;用于输出一个字符&#xff0c;还可以是ASCII代码&#xff08;或者是ASCII表达式&#xff09; cout.put(65)&#xff1b; get()函数 常用形式为&#xff1a;cin.g…

被 C# 的 ThreadStatic 标记的静态变量,都存放在哪里了?

一&#xff1a;背景 1. 讲故事前几天公号里有一位朋友留言说&#xff0c;你windbg玩的溜&#xff0c;能帮我分析下被 ThreadStatic 修饰的变量到底存放在哪里吗&#xff1f;能不能帮我挖出来????????????&#xff0c;其实这个问题问的挺深的&#xff0c;玩高级语言…

唐山师范学院计算机论文,唐山师范学院校园网络解决方案 毕业论文

唐山师范学院校园网络解决方案 毕业论文 (43页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;9.90 积分1 唐山师范学院 专 科毕业论文 题 目 唐山师范学院校园网络解决方案 学 生 指导教师 年 级 200…