
要求最短的路径,首先得把这些边都存储起来,边的存储有邻接表和邻接矩阵两种,这个题数据最大20万个,用邻接矩阵肯定不行,只能使用邻接表来存储。
求最短路的算法 Dijkstra,Floyd,Bellman,spfa;
这个题想要100%通过测试用例,只能使用效率高但是不是很稳定的spfa算法。
需要注意的是,初始化给所有路径的长度定义的无穷大这个数值,不能太大,也不能太小,比如说0x3fffffff,具体大小根据题中所给的边权的范围来定。
Dijkstra(迪杰斯特拉)算法
- Dijkstra算法所求的是单源的最短路径,从起点开始,每一次都找到当前起点的最短可到达的点,然后再进行松弛。
- 该算法在使用时要求所包括的边中不能有负权边。

这可以看出,原本A -> B最短路径应该是 1 ,如果存在负权边的话就变成了2
#define MAXN 1000 //最大顶点数
#define INF 0x3fffffff //一个很大的数
int n = 0, m = 0, s = 0;//n为顶点数 m为边数 s为起点
int d[MAXN] = {
0}; //起点到各点最短路径的长度
int visit[MAXN] = {
0};//记录已经找到的最短路径的点 0--》未找到 1--》表示找到
int arr[MAXN][MAXN] = {
0}; //暂时用邻接矩阵来存储各个边
void Dijkstra()
{
int i = 0;
//初始化一步可以到达的路径长度
for(i = 0;i < n;i++)
{
if(arr[s][i])
{
d[i] = arr[s][i];
}
else
{
d[i] = INF;
}
}
visit[s] = 1;//起点写进数组中
d[s] = 0; //自己到自己的路径设置为0
for(i = 0;i < n; i++)
{
//找到一条最短的路
int j = 0,u = -1,min = INF;
for(j = 0; j < n; j++)
{
//如果存在一条最短路径,并且该点没有被访问,更新min 和 u
if(!visit[j] && d[j] < min)
{
u = j;
min = d[j]

本文介绍了求解图中最短路径的四种算法:Dijkstra、Floyd、Bellman及SPFA。在面对不同场景时,选择合适的算法至关重要。Dijkstra适用于无负权边的单源最短路径;Floyd能处理负权边,但时间复杂度较高;Bellman算法用于含负权图,但效率较低;SPFA在存在负权边且对时间复杂度有要求时是较好的选择,但其稳定性不佳。
最低0.47元/天 解锁文章
1144

被折叠的 条评论
为什么被折叠?



