AOJ Single Source Shortest Path I(单源最短路径)

链接:https://vjudge.net/problem/Aizu-ALDS1_12_B
思路:与最小生成树写法类似,只是判断条件有所更改。最小生成树是搜索到每个点最小的距离然后更新,最短路径则是通过
if(d[v]>d[u]+M[u][v])
d[v] = d[u] + M[u][v];
来更新最短路径,相邻点加上两点路径若小于原来的最短路径,则更新。

其余类似请参考最小生成树:https://www.jianshu.com/p/e07bfcb7b82c

代码:
#include<iostream>
using namespace std;
static const int MAX = 100;
static const int INFTY = (1<<21);
static const int WHITE = 0;
static const int GRAY = 1;
static const int BLACK = 2;

int n,M[MAX][MAX];

void dijkstra(){
int minv;
int d[MAX],color[MAX];

for(int i=0;i<n;i++){
d[i] = INFTY;
color[i] = WHITE;
}

color[0] = GRAY;
d[0] = 0;

while(1){
minv = INFTY;
int u = -1;
for(int i=0;i<n;i++){
if(minv>d[i]&&color[i]!=BLACK){
u = i;
minv = d[i];
}
}
if(u==-1)break;
color[u] = BLACK;

for(int v=0;v<n;v++){
if(color[v]!=BLACK&&M[u][v]!=INFTY){
if(d[v]>d[u]+M[u][v]){//如果相邻点两步距离之和小于原来的一步,则更新最小步数。
d[v] = d[u] + M[u][v];
color[v] = GRAY;
}
}
}
}
for(int i=0;i<n;i++){
cout<<i<<" "<<(d[i]==INFTY?-1:d[i])<<endl;
}
}

int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
M[i][j] = INFTY;
}
}
int k,c,u,v;
for(int i=0;i<n;i++){
cin>>u>>k;
for(int j=0;j<k;j++){
cin>>v>>c;
M[u][v] = c;
}
}
dijkstra();
return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 6,172评论 0 2
  • 我和你,只是慢慢接近的距离。 我和你,不理你,你就在那里。 我和你,除了我,你从不靠近。 我和你,其他人无法...
    上官新云阅读 2,615评论 0 0
  • 作者按照两条线索推进,一条是人文一条是科学。人文的演变过程是神学到个人为中心,再到算法。科学演变认为人类历史是生物...
    总是老二阅读 1,661评论 0 0
  • 三月风走过带走了您的肉体和灵魂也带走了我的笑容深刻的影像在眼前晃动看见您的笑容如沐春风 您的头发是否该理理了转动的...
    莲花墨阅读 2,607评论 21 58
  • mongoose 文档中提到: When your application starts up, Mongoose...
    wlszouc阅读 1,769评论 0 0

友情链接更多精彩内容