D02 最短路 Dijkstra 算法 P4779【模板】单源最短路径
D02 最短路 Dijkstra 算法——信息学竞赛算法_哔哩哔哩_bilibili
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]); }
//朴素 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]); }
Dijkstra及其复杂度证明_dijkstra算法复杂度-CSDN博客
浙公网安备 33010602011771号