• 【算法】spfa算法求最短路(没有负环)


    题目 

    给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数

    请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible

    数据保证不存在负权回路。

    输入格式

    第一行包含整数 n 和 m。

    接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

    输出格式

    输出一个整数,表示 1 号点到 n 号点的最短距离。

    如果路径不存在,则输出 impossible

    数据范围

    1 ≤ n,m ≤ 1e5
    图中涉及边长绝对值均不超过 10000。

    思路

             bfs思想,将节点1的距离初始化为0,存入队列中进入循环。在循环中从队列中取出一个节点p,使用节点p对p的后继节点a进行更新(如果1->...->a的距离大于1->...->p->a的距离,则对a节点进行更新,如果点a不在队列中,就把点a放入这个队列中),将p的后继节点遍历完之后进入下一次循环,直到队列为空(如果存在负环,则会进入无限循环,但是题目保证不存在负环)。

    代码

    1. #include
    2. #define int long long
    3. #define N 100100
    4. using namespace std;
    5. int n,m;// n表示点数,m表示边数
    6. int w[N],e[N],ne[N],h[N],idx;// 邻接表四件套,w数组储存点a到点b的距离
    7. int dist[N];// dist数组储存点1到点i的距离
    8. bool st[N];// 用来记录点i是否在队列q中
    9. queue<int> q;// bfs核心
    10. void add(int a,int b,int c)
    11. {
    12. w[idx] = c,e[idx] = b,ne[idx] = h[a],h[a] = idx ++;
    13. }
    14. void spfa()
    15. {
    16. memset(dist,0x3f,sizeof(dist));//将距离初始化为无穷大
    17. dist[1] = 0;// 点1到点1的距离为0
    18. st[1] = true;// 将点1储存到队列中
    19. q.push(1);
    20. while(!q.empty())
    21. {
    22. int t = q.front();
    23. q.pop();//将节点从队列中取出
    24. st[t] = false;// 标记一下点t已经不在队列中了
    25. for(int i = h[t]; i != -1; i = ne[i])// 将点t的后继节点遍历一遍
    26. {
    27. int j = e[i];
    28. if(dist[j] > dist[t] + w[i])// 更新符合条件的点
    29. {
    30. dist[j] = dist[t] + w[i];
    31. if(!st[j])// 如果这个点满足dist[j] > dist[t] + w[i]的条件,并且不再队列内部,则将其放入队列中
    32. {
    33. q.push(j);
    34. st[j] = true;
    35. }
    36. }
    37. }
    38. }
    39. }
    40. int32_t main()
    41. {
    42. memset(h,-1,sizeof(h));// 初始化头节点
    43. cin >> n >> m;
    44. for(int i = 0; i < m; i ++)
    45. {
    46. int a,b,c;
    47. cin >> a >> b >> c;
    48. add(a,b,c);
    49. }
    50. spfa();
    51. if(dist[n] > 0x3f3f3f3f / 2) cout << "impossible" << endl;
    52. else cout << dist[n] << endl;
    53. }

  • 相关阅读:
    Ps:移动工具
    [论文笔记] Balboa: Bobbing and Weaving around Network Censorship
    CountDownLatch使用错误+未最终断开连接导致线程池资源耗尽
    OpenCV从2到3的过渡
    视觉系统设计实例halcon-winform-13.图像存储
    DC/AC电源模块:提升光伏发电系统的能源利用率
    2022英伟达显卡排名天梯图
    C++类和对象(下)
    商品规格项数据的遍历以及添加
    8月初整理,Adobe 2022全家桶更新情况(Mac+win)限时分享
  • 原文地址:https://blog.csdn.net/littlegengjie/article/details/134084620