热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Dijkstra算法:寻找网络中最短路径的高效方法

Dijkstra算法是一种高效的图论算法,用于在网络中寻找两点之间的最短路径。该算法通过逐步扩展已知最短路径的节点,最终确定从起点到终点的最优路径。在实际应用中,Dijkstra算法广泛应用于路由选择、交通规划等领域,能够有效解决大规模网络中的路径优化问题。

最短路径


题目描述:

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

输入:

输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。输入保证至少存在1条商店到赛场的路线。
当输入为两个0时,输入结束。

输出:

对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间。

样例输入:
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
样例输出:
3
2


代码如下:

#include 
#include 

using namespace std;

#define N 101

struct E
{
	int next;
	int cost;
};

vector edge[N];
bool mark[N];

int Dis[N];

int main()
{
	int n, m;
	while (scanf("%d%d", &n, &m) != EOF)
	{
		if (n == 0 && m == 0) break;
		for (int i = 1; i <= n; i++) edge[i].clear();

		while (m--)
		{
			int a, b, c;
			scanf("%d%d%d", &a, &b, &c);
			E tmp;
			tmp.cost = c;
			tmp.next = b;
			edge[a].push_back(tmp);
			tmp.next = a;
			edge[b].push_back(tmp);
		}

		for (int i = 1; i <= n; i++)
		{
			Dis[i] = -1;
			mark[i] = false;
		}
		Dis[1] = 0;
		mark[1] = true;
		int newP = 1;
		for (int i = 1; i Dis[newP] + c)
					Dis[t] = Dis[newP] + c;
			}
			int min = 123123123;
			for (int j = 1; j <= n; j++)
			{
				if (mark[j] == true) continue;
				if (Dis[j] == -1) continue;
				if (Dis[j]  
 




#include 
#include 

using namespace std;

#define N 101

struct E{ //邻接链表中的链表元素结构体
	int next; //代表直接相邻的结点
	int cost; //代表该边的权值(长度)
};

vector edge[N]; //邻接链表
bool mark[N];//标记,当mark[j]为true时表示结点j的最短路径长度已经得到,该结点已经加入集合K

//距离向量,当mark[i]为true时,表示已得的最短路径长度;否则,表示所有从结点1出发,
//经过已知的最短路径达到集合K中的某结点,再经过一条边到达结点i的路径中最短的距离
int Dis[N];

int main() {

	int n, m;
	while (scanf("%d%d", &n, &m) != EOF) {

		if (n == 0 && m == 0) break;
		for (int i = 1; i <= n; i++) edge[i].clear(); //初试化邻接链表

		while (m--) {

			int a, b, c;
			scanf("%d%d%d", &a, &b, &c);

			E tmp;
			tmp.cost = c;
			tmp.next = b;
			edge[a].push_back(tmp);
			tmp.next = a;
			edge[b].push_back(tmp); //将邻接信息加入邻接链表,由于原图为无向图,固每条边信息都要添加到其两个顶点的两条单链表中
		}

		for (int i = 1; i <= n; i++) { //初始化
			Dis[i] = -1; //所有距离为-1,即不可达
			mark[i] = false; //所有结点不属于集合K
		}

		Dis[1] = 0; //得到最近的点为结点1,长度为0
		mark[1] = true; //将结点1加入集合K
		int newP = 1; //集合K中新加入的点为结点1

		int time = n - 1;
		while (time--) { //循环n-1次,按照最短路径递增的顺序确定其他n-1个点的最短路径长度
			
			for (int j = 0; j  
 


推荐阅读
  • POJ 1696: 空间蚂蚁算法优化与分析
    针对 POJ 1696 的空间蚂蚁算法进行了深入的优化与分析。本研究通过改进算法的时间复杂度和空间复杂度,显著提升了算法的效率。实验结果表明,优化后的算法在处理大规模数据时表现优异,能够有效减少计算时间和内存消耗。此外,我们还对算法的收敛性和稳定性进行了详细探讨,为实际应用提供了可靠的理论支持。 ... [详细]
  • 考研数据结构复习:链式栈深入解析与应用
    在考研数据结构复习中,链式栈的深入解析与应用是一个重要环节。本文详细探讨了链式栈的实现方法,特别是栈底和栈顶指针的使用。通过对比常见的单链表实现方式,本文整理了一份代码示例,与王道复习指导中的链式存储类型高度一致。此外,本文还提供了详细的注释和解释,帮助读者更好地理解和掌握链式栈的原理与应用。 ... [详细]
  • 题目描述:小K不幸被LL邪教洗脑,洗脑程度之深使他决定彻底脱离这个邪教。在最终离开前,他计划再进行一次亚瑟王游戏。作为最后一战,他希望这次游戏能够尽善尽美。众所周知,亚瑟王游戏的结果很大程度上取决于运气,但通过合理的策略和算法优化,可以提高获胜的概率。本文将详细解析洛谷P3239 [HNOI2015] 亚瑟王问题,并提供具体的算法实现方法,帮助读者更好地理解和应用相关技术。 ... [详细]
  • 题目《UVa 11978 福岛核爆问题》涉及圆与多边形交集面积的计算及二分法的应用。该问题的核心在于通过精确的几何运算与高效的算法实现来解决复杂图形的面积计算。在实现过程中,特别需要注意的是对多边形顶点的平移处理,确保所有顶点包括最后一个顶点 \( p[n] \) 都经过正确的位移,以避免因细节疏忽导致的错误。此外,使用循环次数为50次的二分法能够有效提高算法的精度和稳定性。 ... [详细]
  • CCCCGPLT L2005: 集合相似度计算的双指针算法优化 ... [详细]
  • 在幼儿园中,有 \( n \) 个小朋友需要通过投票来决定是否午睡。尽管这个问题对每个孩子来说并不是特别重要,但他们仍然希望通过谦让的方式达成一致。每个人都有自己的偏好,但为了集体和谐,他们决定采用一种最小割的方法来解决这一问题。这种方法不仅能够确保每个人的意愿得到尽可能多的尊重,还能找到一个最优的解决方案,使整体满意度最大化。 ... [详细]
  • 题目旨在解决树上的路径最优化问题,具体为在给定的树中寻找一条长度介于L到R之间的路径,使该路径上的边权平均值最大化。通过点分治策略,可以有效地处理此类问题。若无长度限制,可采用01分数规划模型,将所有边权减去一个常数m,从而简化计算过程。此外,利用单调队列优化动态规划过程,进一步提高算法效率。 ... [详细]
  • 本研究基于状态空间方法,通过动态可视化技术实现了汉诺塔问题的求解过程,即将n个盘子从A柱移动到C柱。本文提供了一个使用C语言在控制台进行动画绘制的示例,并详细注释了程序逻辑,以帮助读者更好地理解和学习该算法。 ... [详细]
  • 在2015年世界总决赛的Tours问题中,参赛者面临一个包含n个节点和m条边的无向图挑战。任务是选定一种颜色数量k,并使用这些颜色为每条边着色。核心要求是在图中的任何简单循环中,每种颜色的边数必须相等。该研究对竞赛路线进行了全面分析,探讨了满足条件的所有可能的着色方案。 ... [详细]
  • 本文深入探讨了 CF570D 问题中树的请求处理方法,重点分析了长链剖分技术的应用与优化。题目涉及一棵包含 n 个节点的树,每个节点上有一个字符。每次查询时,需要处理某个节点 x 的相关请求。通过长链剖分技术,可以高效地解决这类问题,显著提升算法性能。本文不仅介绍了基本的长链剖分原理,还详细讨论了其在具体实现中的优化技巧,为解决类似问题提供了宝贵的参考。 ... [详细]
  • Candyland的糖果公园以其独特的结构吸引了众多喜爱糖果的小朋友。公园内设有多个游览点,每个点不仅景色宜人,还提供免费的糖果。这些游览点通过复杂的路径连接,形成了一棵包含n个节点的树状结构。为了优化游客体验,公园管理团队采用了一种基于树上动态修改的莫队算法,有效提升了糖果发放和游玩项目的管理效率。 ... [详细]
  • CodeForces 722C 数组破坏算法解析与优化策略 ... [详细]
  • C++20 引入了指定初始化器(Designated Initializers),这一特性借鉴了 C# 的对象初始化器和 Kotlin 的 apply 范围函数。指定初始化器允许开发者在初始化结构体或类时,直接指定成员变量的值,提高了代码的可读性和简洁性。此外,该特性还支持嵌套初始化,使得复杂对象的初始化更加直观和灵活。本文将详细解析指定初始化器的语法、应用场景及其实现细节,并通过具体示例展示其在实际开发中的优势。 ... [详细]
  • 2017广西邀请赛复盘:NWAFU全国邀请赛训练赛第八场
    本次训练赛(NWAFU全国邀请赛复盘之一)基于2017年广西邀请赛的赛题,重点解析了A、E、F、G等关键题目,旨在通过复盘帮助参赛者深入理解相关知识点和技术应用,为后续比赛提供宝贵经验。 ... [详细]
  • C语言实现:深入解析希尔排序算法
    C语言实现:深入解析希尔排序算法 ... [详细]
author-avatar
_Cokoice
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有