洛谷上的题:https://www.luogu.com.cn/problem/P3371
    时间复杂度,最坏的情况也是(MN)
    代码如下:

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. const int INF = 0x3f3f3f3f;
    4. const int FF = 0x7fffffff;
    5. const int N = 1e6+5;
    6. int u[N],v[N],w[N],dis[N],b[N],first[N],net[N];
    7. int n,m,k;
    8. int main ()
    9. {
    10. cin>>n>>m>>k;
    11. for(int i=1;i<=m;i++)
    12. {
    13. cin>>u[i]>>v[i]>>w[i];
    14. net[i]=first[u[i]];
    15. first[u[i]]=i;
    16. }
    17. memset(dis,0x3f,sizeof dis);
    18. //memset(first,-1,sizeof first);
    19. dis[k]=0;
    20. queue<int> q;
    21. q.push(k);
    22. b[k]=1; //标记点k已入队
    23. while(!q.empty())
    24. {
    25. for(int i=first[q.front()];i;i=net[i])//扫描当前顶点所有边
    26. {
    27. if(dis[v[i]]>dis[u[i]]+w[i])//判断此边是否可以松弛
    28. {
    29. dis[v[i]]=dis[u[i]]+w[i];//更新k到v[i]的最短路程
    30. if(b[v[i]]==0)//判断是否在队列中
    31. {
    32. b[v[i]]=1;
    33. q.push(v[i]);
    34. }
    35. }
    36. }
    37. b[q.front()]=0;
    38. q.pop();
    39. }
    40. for(int i=1;i<=n;i++)
    41. {
    42. if(dis[i]==INF)
    43. cout<<FF<<" ";
    44. else
    45. cout<<dis[i]<<" ";
    46. }
    47. return 0;
    48. }

    11.png