D02 最短路 Dijkstra 算法 P4779【模板】单源最短路径

D02 最短路 Dijkstra 算法——信息学竞赛算法_哔哩哔哩_bilibili

P4779 【模板】单源最短路径(标准版) - 洛谷

1. d[] 维护点到根的最短路

2. vis[] 维护点第1次出队

3. 优先队列 <d[],v> 维护最优点

4. 松弛:d[v]>d[u]+w

5. 最优点第1次出队才有必要扩展

//堆优化 Dijkstra O(mlogn)
#include<bits/stdc++.h>
using namespace std;

const int N=100010;
int n,m,s,a,b,c;
vector<pair<int,int>> e[N];
int d[N],vis[N];

void dijkstra(){
  memset(d,0x3f,sizeof d); d[s]=0;
  priority_queue<pair<int,int>> q;
  q.push({0,s});
  while(q.size()){
    auto u=q.top().second; q.pop();
    if(vis[u])continue; //再出队跳过
    vis[u]=1; //第1次出队
    for(auto [v,w]:e[u]){
      if(d[v]>d[u]+w){ //松弛
        d[v]=d[u]+w;
        q.push({-d[v],v});
      }
    }
  }
}
int main(){
  cin>>n>>m>>s;
  for(int i=0;i<m;i++){
    scanf("%d%d%d",&a,&b,&c);
    e[a].push_back({b,c});
  }
  dijkstra();
  for(int i=1;i<=n;i++) printf("%d ",d[i]);
}

 

P3371 【模板】单源最短路径(弱化版) - 洛谷

//朴素 Dijkstra O(n^2)
#include<bits/stdc++.h>
using namespace std;

const int N=100010,inf=(1<<31)-1;
int n,m,s,a,b,c;
vector<pair<int,int>> e[N];
int d[N],vis[N];

void dijkstra(){
  for(int i=0;i<=n;i++) d[i]=inf; d[s]=0;
  for(int i=1;i<n;i++){ //枚举次数
    int u=0;
    for(int j=1;j<=n;j++) //枚举点
      if(!vis[j]&&d[j]<d[u]) u=j;
    vis[u]=1; //选u
    for(auto [v,w]:e[u]) //枚举邻点
      if(d[v]>d[u]+w) //松弛
        d[v]=d[u]+w;
  }
}
int main(){
  cin>>n>>m>>s;
  for(int i=0; i<m; i++){
    cin>>a>>b>>c;
    e[a].push_back({b,c});
  }
  dijkstra();
  for(int i=1;i<=n;i++) printf("%d ",d[i]);
}

 

最短路 - OI Wiki

Dijkstra及其复杂度证明_dijkstra算法复杂度-CSDN博客

 

posted @ 2022-05-28 13:08  董晓  阅读(3861)  评论(0)    收藏  举报