C++ 最短路径

本文介绍了图论中的最短路径问题,包括四种主流算法:Floyd-Warshall、Dijkstra、Bellman-Ford(SPFA)和Johnson,以及A*算法。Floyd算法适用于加权图的多源最短路径,Dijkstra算法用于计算单源最短路径,但不支持负权边;Bellman-Ford算法能处理负权边,但时间复杂度较高;SPFA是Bellman-Ford的优化;Johnson算法则能处理带负权重的图;A*算法是静态路网中求解最短路径的有效搜索方法。
摘要由CSDN通过智能技术生成

目录:

最短路径简介

Floyd算法 \ Floyd-warshall算法

Dijkstra算法

Bellman-Ford算法 \ SPFA算法

Johnson算法

A*算法


最短路径简介:

        最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括:

        (1)确定起点的最短路径问题( 即已知起始结点),求最短路径的问题。

        (2)确定终点的最短路径问题(与确定起点的问题相反),该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。

        (3)确定起点终点的最短路径问题 - 即已知起点和终点,求两结点之间的最短路径。

        (4)全局最短路径问题 - 求图中所有的最短路径。

        解决最短路径问题有 5 种主流的算法:Floyd算法 \ Floyd-warshall算法,Dijkstra算法,Bellman-Ford算法 \ SPFA算法,Johnson算法,A*算法。

Floyd算法 \ Floyd-warshall算法:

        Floyd算法 和 Floyd-warshall算法 实际上是一个东西,只不过是名字不同罢了。

        Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授 罗伯特·弗洛伊德 命名。

        Floyd算法的边权值可正可负,但需要使用邻接矩阵存储图的边权值。

        时间复杂度:O(n^{3})

【代码实现】

//假设有n个点,m条边,求1~n的最短路径 
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<cstring>
#include<queue>//头文件 
using namespace std;
int n,m;
int mapp[1001][1001];
int clean()//初始化 
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i==j)
			{
				mapp[i][j]=0;
			}
			else
			{
				mapp[i][j]=0x7f7f7f;
				//mapp[i][j]=- 0x7f7f7f;
				//初始为无穷大或无穷小,需要根据题目变通 
			}
		}
	}
} 
int main()
{
	scanf("%d%d",&n,&m);//读入 
	clead();//初始化 
	for(int i=1;i<=m;i++)//读入边的值 
	{
		int u,v,w; 
		scanf("%d%d%d",&u,&v,&w);
		mapp[u][v]=w;//有向图 
		//mapp[u][v]=mapp[v][u]=w;无向图 
	}
	for(int k=1;k<=n;k++)//Floyd算法模板 
	{
	    for(int i=1;i<=n;i++)
		{
           for(int j=1;j<=n;j++)
			{
                if(mapp[i][k]+mapp[k][j]<mapp[i][j])
				{
      
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值