对求最短路径常见算法的简单总结

本文总结了四种常见的最短路径算法:Dijkstra、Bellman-Ford、Floyd和SPFA。Dijkstra算法适用于不带负权重的单源最短路径问题;Bellman-Ford算法可处理带有负权重的环;Floyd算法计算所有顶点对的最短路径;SPFA是单源最短路径算法,能处理负权重,但效率较低。文章还提供了每个算法的基本步骤和参考资料链接。
摘要由CSDN通过智能技术生成

最近正好在学最短路径,借此机会把学到的知识总结下,一来分享给大家阅读,二来方便以后自己查阅。

先列一下下面会总结到的求最短路径的算法:

1.Dijkstra算法;

2.Bellman-Ford算法;

3.Folyd算法;

4.SPFA算法;


Dijkstra算法:求单源最短路径(不带负权重的环)


step1.初始化,dis[V0]=0,dis[i]=无穷大(i≠V0,表示不可达);

step2.从V-U中选择使dis[i]值最小的顶点i,将i加入到U中;

step3.更新与i直接相邻顶点的dis值(dis[j]=min{dis[j],dis[i]+cost[i][j]})。

step4.重复step2和step3,直到U=V,停止。


#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>

using namespace std;
#define MAXN 10000
const int INF=0x3f3f3f3f;
int n, m, ori;
int dis[MAXN], pre[MAXN];
int cost[MAXN][MAXN];

struct node
{
    int v;
    int len;
    node(){}
    node(int vv, int ll):v(vv), len(ll){}
    bool operator < (const node& a) const
    {
        return len > a.len;
    }
};

void Dijkstra()
{
    for(int i = 1; i <= n; i++)
        dis[i] = INF;
    priority_queue<node> q;//最小优先队列优化
    q.push(node(ori, 0));
    dis[ori] = 0;
    while(!q.empty())
    {
        node t;
        t = q.top();
        q.pop();
        int now = t.v;
        for(int j = 1; j <= n; j++)
        {
            if(cost[now][j] != INF && dis[j] > dis[now] + cost[now][j])
            {
                dis[j] = dis[now] + cost[now][j];
                pre[j] = now;
                q.push(node(j, dis[j]));
            }

        }

    }

}

void print_path(int pos)
{
    printf("%d\n", dis[pos]);
    while(ori != pos)
    {
        printf("%d<---", pos);
        pos = pre[pos];
    }
    printf("%d\n", ori);

}

int main()
{
    scanf("%d%d%d", &n, &m, &ori);
    int u, v, w;
    memset(cost, INF, sizeof(cost));
    while(m--)
    {
        scanf("%d%d%d", &u, &v, &w);
        cost[u][v] = w;
        cost[v][u] = w;//若是有向图则不要这行
    }
    Dijkstra();
    for(int i = 1; i <= n; i++)
    {
        printf("%d to %d: 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值