最短路径--dijkstra算法(C实现)
这是图论里的入门算法,但又有实力不够,因此困扰了我许久,在网上也学习了很多大牛的解题思路,我也有所感悟,简单记录下,帮助自己,也希望让更多的学会,我这里只写代码,算法思想可以去其他博主那里学习,这个代码比较简短,希望大家学会,对竞赛友友也有帮助的呦!求有向图中任意两个顶点的最短路径---dijkstra算法。
·
求有向图中任意两个顶点的最短路径---dijkstra算法
这是图论里的入门算法,但又有实力不够,因此困扰了我许久,在网上也学习了很多大牛的解题思路,我也有所感悟,简单记录下,帮助自己,也希望让更多的学会,我这里只写代码,算法思想可以去其他博主那里学习,这个代码比较简短,希望大家学会,对竞赛友友也有帮助的呦!
直接上代码:
#include<bits/stdc++.h>
using namespace std;
const int N=100;
int mp[N][N];//地图
int dis[N];//距离数组
int vis[N];//标记数组
int n,m,start,end;//顶点数,边数,起始点,终点
int dijkstra(){
for(int i=1;i<=n;i++){//第一个for:控制循环次数
int index=-1;//保存所找到的点
for(int j=1;j<=n;j++){//第二个for:找出距离源点最近的点
if(!vis[j]&&(index==-1||dis[j]<dis[index])){
index=j;
}
}
for(int j=1;j<=n;j++){//更新dis数组
dis[j]=min(dis[j],dis[index]+mp[index][j]);
}
vis[index]=1;//标记改点,表示已访问过
}
if(dis[end]!=0x3f3f3f3f){
return dis[end];
}else{
return -1;
}
}
int main(){
memset(mp,0x3f,sizeof(mp));//memset函数包含在<string.h>头文件里,挺好用,大家自行学习
memset(dis,0x3f,sizeof(dis));
cout<<"请输入点数 边数 起点 终点:"<<endl;
cin>>n>>m>>start>>end;
int tmp=m;//记录边的次数
while(tmp--){
int a,b,w;//起点,终点,权值
cin>>a>>b>>w;
mp[a][b]=(w<mp[a][b]?w:mp[a][b]);//三目运算符,有重复的边选择更短的
}
for(int i=1;i<=n;i++){
if(mp[start][i]!=0x3f3f3f3f){
dis[i]=mp[start][i];
}
}
dis[start]=0;
int len=dijkstra();
cout<<len;
return 0;
}

测试用例
6 8 3 6
3 2 4
3 1 8
3 1 2
2 4 2
4 5 1
5 6 1
1 5 4
1 6 10
//运行结果为 7
代码哪里有问题随时私信我,一定及时更改。
感谢大家浏览!!!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)