迪杰斯特拉算法求单源最短路径(c++)

贪心算法求单源最短路径(迪杰斯特拉算法) Dijkstra算法是最具代表性的解单源最短路径问题的贪心算法。 阅读详情
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;

#define INFINITY 65535                       /*无边时的权值*/
#define MAX_VERTEX_NUM  10                   /*最大顶点数*/

/*定义结构体*/
typedef struct MGraph
{
	string vexs[10];                           /*顶点信息*/
	int arcs[10][10];                          /*邻接矩阵*/
	int vexnum,arcnum;                         /*顶点数和边数*/
}MGraph;

int LocateVex(MGraph G,string u)               /*返回顶点u在图中的位置*/
{
	for(int i=0;i<G.vexnum;i++)
		if(G.vexs[i]==u)
			return i;                        /*如果存在则返回位置,否则返回-1*/
	return -1;                        
}

void CreateDN(MGraph &G)                     /*构造有向网*/
{
	string v1,v2;
	int w;                                   /*权值*/
	int i,j,k;
	cout<<"请输入顶点数和边数:";
	cin>>G.vexnum>>G.arcnum;

	cout<<"请输入顶点:";
	for(i=0;i<G.vexnum;i++)
		cin>>G.vexs[i];

	for(i=0;i<G.vexnum;i++)                /*每个边的权值初始化为无穷大*/
	{                 
		for(j=0;j<G.vexnum;j++)
		{
			G.arcs[i][j]=INFINITY;
		}
	}

	cout<<"请输入边和权值:"<<endl;
	for(k=0;k<G.arcnum;k++)
	{
		cin>>v1>>v2>>w;                     /*输入顶点v1和v2以及它们之间的权值*/
		i=LocateVex(G,v1);
		j=LocateVex(G,v2);
		G.arcs[i][j]=w;                     /*根据输入的顶点找到该顶点在图中的位置并给这个边赋值*/
	}
}


/*迪杰斯特拉算法求有向网G的v0顶点到其余顶点v的最短路径p[v]及带权长度D[v]
p[][]=-1表示没有路径,p[v][i]存的是从v0到v当前求得的最短路径经过的第i+1个顶点(这是打印最短路径的关键),
则v0到v的最短路径即为p[v][0]到p[v][j]直到p[v][j]=-1,路径打印完毕。
final[v]为true当且仅当v属于s,即已经求得从v0到v的最短路径。
*/

void ShortestPath_DIJ(MGraph G,int v0,int p[][MAX_VERTEX_NUM],int D[])
{
	int v,w,i,j,min;
	bool final[10];

	for(v=0;v<G.vexnum;v++)
	{
		final[v]=false;                      /*设初值*/
		D[v]=G.arcs[v0][v];                  /*D[]存放v0到v的最短距离,初值为v0到v的直接距离*/
        for(w=0;w<G.vexnum;w++)
			p[v][w]=-1;                      /*设p[][]初值为-1,即没有路径*/
        if(D[v]<INFINITY)                    /*v0到v有直接路径*/
		{
			p[v][0]=v0;                      /*v0到v最短路径经过的第一个顶点*/
			p[v][1]=v;                       /*v0到v最短路径经过的第二个顶点*/
		}
	}

   	D[v0]=0;                                /*v0到v0的距离为0*/
	final[v0]=true;                         /*v0顶点并入s集*/

	for(i=1;i<G.vexnum;i++)                 /*其余G.vexnum-1个顶点*/
	{
		/*开始主循环,每次求得v0到某个顶点v的最短路径,并将v并入s集,然后跟新p和D*/
		min=INFINITY;
		for(w=0;w<G.vexnum;w++)             /*对所有顶点检查*/
			if(!final[w]&&D[w]<min)         /*在s集之外(即final[]=false)的顶点中找离v0最近的顶点,将其赋给v,距离赋给min*/
			{
				v=w;
				min=D[w];
			}	
			final[v]=true;                  /*v并入s集*/

            for(w=0;w<G.vexnum;w++)         /*根据新并入的顶点,跟新不在s集的顶点到v0的距离和路径数组*/
			{
				if(!final[w]&&min<INFINITY&&G.arcs[v][w]<INFINITY&&(min+G.arcs[v][w])<D[w])
				{
					/*w不属于s集v0->v->w的距离<目前v0->w的距离*/
					D[w]=min+G.arcs[v][w];    /*跟新D[w]*/
					for(j=0;j<G.vexnum;j++)    /*修改p[w],v0到w经过的顶点包括v0到v经过的所有顶点再加上顶点w*/
					{
						p[w][j]=p[v][j];
						if(p[w][j]==-1)        /*在p[w][]第一个等于-1的地方加上顶点w*/
						{
							p[w][j]=w;
							break;
						}
					}
				}
			}
	}

}


void main()
{
	int i,j;
	MGraph g;
	CreateDN(g);
	int p[MAX_VERTEX_NUM][MAX_VERTEX_NUM];             /*最短路径数组*/
	int D[MAX_VERTEX_NUM];                             /*最短距离数组*/
	ShortestPath_DIJ(g,0,p,D);

	cout<<"最短路径数组p[i][j]如下:"<<endl;
	for(i=0;i<g.vexnum;i++)
	{
		for(j=0;j<g.vexnum;j++)
			cout<<setw(3)<<p[i][j]<<" ";
		cout<<endl;
	}

	cout<<g.vexs[0]<<"到各顶点的最短路径及长度为:"<<endl;
	for(i=0;i<g.vexnum;i++)
	{
		if(i!=0&&D[i]!=INFINITY)
		{
			cout<<g.vexs[0]<<"-"<<g.vexs[i]<<"的最短路径长度为:"<<D[i];
			cout<<"最短路径为:";
			for(j=0;j<g.vexnum;j++)
			{
				if(p[i][j]>-1)
					cout<<g.vexs[p[i][j]]<<" ";
			}
			cout<<endl;
		}
		else if(D[i]==INFINITY)
			cout<<g.vexs[0]<<"-"<<g.vexs[i]<<":"<<"不可达"<<endl;
	}
}

数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法) 一、最短路径概念 最短路径,顾名思义,两结点之间最短的路径(可以是非邻接结点)。 最小生成树和最短路径区别: 最小生成树:连通图的最短路径。 最短路径:两任意结点之间(可以非邻接)的最短路径。 二、迪杰斯特拉(Dijkstra)算法 优点:效率较高,时间复杂度为O(n^2)。 缺点:只能求一个顶点到所有顶点的最短路径。 (单源最短路) 1、原理 1、先选定一个根结点,并选定一个数组,先确定未遍历前的初始距离,把距离最短的邻接结点选定为中间结点,并标记访问过,开始往下遍历,挨个 阅读详情

相关推荐

Dijkstra算法讲解(单源最短路径问题求解)

无论是算法分析课程还是Java课程设计,都对有向图中的最短路径情有独钟,今天准备对单愿最短路径的解决方案进行一下详解,免得每一次用到都是从头再来2333适用条件:在有向图中,求一个顶点到其他顶点的最短路径 首先让我们先回顾一下,最简单的多源最短路径的求法:Floyd算法 实例讲解这里呢我们通过这个例题对这个算法进行解析:(节选自《啊哈算法》)题目中的关系如图所示:这里呢,我们依旧使用二维数组来存

晨阳再升的博客 7412

Dijkstra算法图解,C++实现Dijkstra算法

Dijkstra算法图解,C++实现Dijkstra算法。添加顶点,删除顶点,添加边,删除边。Dijkstra算法计算是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到起点距离最近且未访问过的顶点的邻接节点,直到扩展到所有终点为止。

weixin_40355471的博客 7072

c语言数据结构--------Dijkstra算法求单源最短路径

/边集加边<1,2>,<1,5>,<2,5>,<5,2>,<2,3>,<5,3>,<5,4>,<3,4>,<4,3>,<4,1>printf("%d的最短路径为%d ,其的前驱结点为%d\n",i+1,dist[i],path[i]);//记录从t到各顶点的最短路径中各顶点的前驱结点。//记录从t到各顶点的最短路径。//记录当前图的顶点数量和边数。//修改path[j]值。//修改dist[j]值。//顶点集添加1,2,3,4,5。//固定j对应的路径。//返回x在顶点表的索引。//图,邻接矩阵存储。

2301_77589543的博客 1016

C++最短路径Dijkstra算法详解

第一步 定义数组和变量: int f[101][101]; //将得到的数据转化成邻接矩阵 int ans[101]; //用来记录答案(从1到各点的最短路径) int q1[105],l=0,r=1; //队列,详见《笔记——栈,队列,快速幂,线性筛,并查集,随机数》 bool YN[101]; //记录一个点是否入队 然后初始化: for(re int i=1;i<=n;++i){ YN[i]=false; for(re int j=1;j<=n;++j){ if(i!

Andysun06的博客 825

Dijkstra(迪杰斯特拉)算法求单源最短路径问题

Dijkstra(迪杰斯特拉)算法求单源最短路径问题 重要的事情说三遍:代码不是我写的!代码不是我写的!代码不是我写的! 第一个算法是严蔚敏数据结构(C语言版)上写的,第二个算法是王道数据结构上写的,我想着记录在博客上以后比较好找。 如有谬误或者不足还请批评指正! void ShortestPath_DIJ(MGraph G, int v0, PathMatrix &P, ShortPat...

Ricardo的博客 727

C++实现Dijkstra(迪杰斯特拉)算法

主要为大家详细介绍了C++实现Dijkstra(迪杰斯特拉)算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

C/C++提高篇——Dijkstra迪杰斯特拉算法求最短路径

通过Dijkstra迪杰斯特拉算法求最短路径(C++实现)

Code_流苏:在代码中寻诗意,在实践中觅真知 5372

拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,总算是跑通了。

/保存的文件个数这里之所以需要用到委托,直接更新textbox文本中的内容,以及复制picturebox的image会提示不是从齐创建的线程调用。

morsth的博客 4814

单源最短路径——迪杰斯特拉(Dijkstra)算法 C++实现

求最短路径之Dijkstra算法 Dijkstra算法是用来求单源最短路径问题,即给定图G和起点s,通过算法得到s到达其他每个顶点的最短距离。 基本思想:对图G(V,E)设置集合S,存放已被访问的顶点,然后每次从集合V-S中选择与起点s的最短距离最小的一个顶点(记为u),访问并加入集合S。之后,令u为中介点,优化起点s与所有从u能够到达的顶点v之间的最短距离。这样的操作执行n次(n为顶点个数)...

Nick 1万+

【Cadence】 ADS Dynamic Link使用教程

在Cadence617上使用ADS Dynamic Link

乾巽的博客 6074

避开这些坑!Kaggle数据集下载常见问题及解决方案(含Header Editor插件配置)

本文针对Kaggle数据集下载过程中的常见难题,提供了系统性的解决方案。重点解决了验证码无法显示、API安装失败、密钥文件配置错误及下载命令执行问题,并详细介绍了使用Header Editor插件配置请求头以绕过验证码障碍的实战方法,帮助用户高效获取数据。

weixin_29043895的博客 301

算法之迪杰斯特拉(dijkstra)非常详细介绍

迪杰斯特拉(dijkstra)算法是单源最短路径问题的求解方法。单源最短路径就在给出一个固定网络,指定一个原点s,一个目标点e,求这两个点之间的最短路径。举个栗子来理解一下。 小明上学的时候,从家到学校的道路非常多,小明为了减少路上骑车的时间,因此,想找出一个最短的路径。他构造一个网络图,如下: 小明是一个很喜欢动脑筋的同学,他开始研究如何才能找出最优的路径呢? 1)所有的点到家的距离都进行初始化: 2)每次选择距离家最短的一个点,然后用这个点的距离更新其他相邻点到家的距离,如果比当前的点小,则更新节点

PRML_MAN的博客 8万+

用R语言做WGCNA分析全步骤一(附代码解读)【转载】

代码逐句分析一、文章来源二、基因共表达网络构建及模块识别1.数据导入、清洗及预处理2.检查过度缺失值和离群样本3.聚类做离群样本检测4.载入临床特征数据三、自动构建网络及识别模块1.确定合适的软阈值:网络拓扑分析2.一步构建网络和识别模块 一、文章来源 初学WGCNA,觉得博主的代码写的很不错,但其中很多代码在第一遍看的时候有很多地方不理解,后查阅了很多资料,终于看明白了,于是写了一篇笔记,记录自己的学习心得,有不准确的地方,还望各位大佬们不吝赐教~ 原文链接:WGCNA简明指南 二、基因共表达网络构建及模

qq_43138237的博客 2万+

单源最短路径之迪杰斯特拉算法(C语言)

Dijkstra(迪杰斯特拉)算法 采用广度优先搜索思想,对有向赋权图寻找最短路径。 该算法对于不含负权的有向图来说,是目前已知的最快的单源最短路径算法。 时间复杂度:O(n^2) 基本原理:不断为为每个顶点 v 保留目前为止所找到的从s到v的最短路径 上图为戴克斯特拉算法应用示意图。 起点以左下角的红点,目标是右上角的绿点,中间灰色的倒L型为障碍物。蓝色空圈表示”暂定”,用以搜索...

一串代码的博客 8275

泄露测试仪CTS的Sentinel I28使用

本文介绍:泄露测试仪CTS的Sentinel I28使用

qq_34047402的博客 2199

基于情感分析+聚类分析+LDA主题分析对服装产品类的消费者评论分析

本研究旨在通过对服装产品类的消费者评论进行综合分析,为企业提供更全面、更深入的市场洞察和决策支持。同时,本研究的方法和结果也可以为其他领域的消费者评论分析提供借鉴和参考。

m0_64336780的博客 2万+

迪杰斯特拉算法(图示+C语言实现)

迪杰斯特拉是单源最短路算法(即只能求一点,到其他任一点的最短路径,但可以加循环得到任意两点间的最短路径),无法处理带负权变的图 算法思路图示 初始化两个集合 S={A}(只包含源点,表示已经确定最短路径的节点,一旦S中包含所有元素那么算法终止) U={B,C,D,E,F,G} 初始化,所有距离初始化为无穷大 选定点A,更新 选定A-B路径(即S集合为{A,B}),考察B的所有邻接点 为什么选定...

qq_41554337的博客 9291

复制幻灯片到另一个PPT编程

请确保将源PPT文件和目标PPT文件的文件名修改为你实际使用的文件名。运行上述代码后,目标PPT将包含源PPT中的所有幻灯片和形状。这里假设源PPT文件名为"source.pptx",目标PPT文件名为"target.pptx"。方法将每个幻灯片的布局添加到目标PPT中。是一个强大的库,可以用于创建、修改和操作PPT文件。要将一个PPT中的幻灯片复制到另一个PPT,可以使用Python的。这段代码遍历源PPT的每个幻灯片,并使用。步骤 3: 打开源PPT和目标PPT。这将保存修改后的目标PPT文件。

ByteSparkX的博客 1322

C语言 最短路径 迪杰斯特拉(Dijkstra)算法

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。

m0_73070900的博客 8144

数据分片的三种方式:哈希、一致性哈希、按照数据范围分片

数据分片就是按照一定的规则,将数据集划分成相互独立、正交的数据子集,然后将数据子集分布到不同的节点上。通过设计合理的数据分片规则,可将系统中的数据分布在不同的物理数据库中,达到提升应用系统数据处理速度的目的。三种常用的数据分片方式:1. 哈希分片2. 一致性哈希分片(Consistent Hash)3. 按照数据范围分片(Range Based)数据分片的应用场景:1. 数据库扩展2. 分布式缓存对集群部署多个缓存节点,提高缓存的处理能力。

wjianwei666的专栏 1134

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

算法之迪杰斯特拉算法

迪杰斯特拉(Dijkstra)算法是典型求单源(一个顶点到一个顶点)最短路径算法,用于计算一个结点到其他结点的最短路径。 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止。 迪杰斯特拉算法思想 设G=(V,E)为一个带全有向图,把图中顶点集合V分成两组。第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将所到达最短路径的顶点加入到集合S中,直到全部顶点都加入到S中)。第二组为其余未确定最短路径的顶点集合(用U表示,U=V-S,U

weixin_49561445的博客 5543

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C语言-最短路径(Dijskra算法)

1. 顶点下标查找函数(LocateVex) 2. 创建有向网(CreateDN) 3. 打印图函数(print) 4. 展示最短路径函数(displayPath) 5. 查找当前最短路径函数(FindMinDist) 6. 迪杰斯特拉算法(ShortestPath_Dijkstra)

Attract's Blog 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C语言数据结构与算法---最短路径(迪杰斯特拉算法)

文章目录一. 最短路径二. 迪杰斯特拉(Dijkstra)算法1. 算法思路2. 代码实现 一. 最短路径 在网图和非网图中,最短路径的含义是不同的 非网图:因为边上没有权值,所谓最短路径,其实是指两个顶点之间经过的边数最少的路径。 网图:两点之间经过的边上权值之和最少的路径。称路径上第一个顶点是源点,最后一个顶点是终点。 二. 迪杰斯特拉(Dijkstra)算法 用于单源最短路径 1. 算法思路...

myjess’s blog 6816

单源最短路径算法的实现-----迪杰斯特拉(Dijkstra)算法【C/C++】

单源最短路径算法的实现-----迪杰斯特拉(Dijkstra)算法

bblb的博客 2021

浅谈图论——迪杰斯特拉算法(leetcode例题,C++演示)

我们不要被迪杰斯特拉算法的名字吓到了,其实迪杰斯特拉的算法并不复杂。很多时候,传统的并不复杂的算法往往在解决现实问题的时候有这良好的效果。首先我们要搞清楚迪杰斯特拉算法解决的单源最短路径的问题。单源最短路径问题是找到从图中的一个固定顶点(称为源点)到其他所有顶点的最短路径。将源点到其他顶点的距离初始化为无穷大,源点到自身的距离初始化为0。同时,维护一个集合S,其中包含已确定最短路径的顶点,初始时S为空。从未确定最短路径的顶点中选择一个到源点距离最小的顶点,并将其标记为已确定最短路径。将该顶点加入集合S中。

qq_73075805的博客 2239

【迪杰斯特拉算法】单源最短路径(C语言实现)

迪杰斯特拉算法 迪杰斯特拉算法(Dijkstra)是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。 C语言代码实现如下: //【贪心算法】单源最短路径问题 #include <stdio.h> #include <stdlib.h> #define N 5 // 5个顶点,1、2、3、4、5 #define M 9999 /.

qq_54623898的博客 3105
上一篇: c语言存储管理
下一篇: c语言将数据写入文件(用链表实现)
一giao窝里giao
博客等级 码龄11年 37粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值