Dijkstra算法,设无向连通图有n个点1~n,m条边,每条边连接a、b两点,边长为c,求点1到点n的最短路径的距离。
#include"bits/stdc++.h"
using namespace std;
int main(){
int INF = 1e9+7;
int n,m;
cin>>n>>m;
int map[n+7][n+7];
int vis[n+7],dis[n+7];//vis数组表示已加入集合的点,dis存放点n到其余各点的最短距离
memset(map,INF,sizeof(map));//最初图各点距离为INF
for(int i=1;i<=n;++i){
map[i][i]=0;
}
int a,b,c;
for(int i=0;i<m;++i){
cin>>a>>b>>c;
if(map[a][b]>c){//设置边长
map[a][b]=c;
map[b][a]=c;
}
}
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;++i){//初始化点n到各点的距离
dis[i]=map[n][i];
}
vis[n]=1;//点n存放到集合
for(int i=1;i<n;++i){
int minn=INF;
int tmp;
for(int j=1;j<=n;++j){//找出到集合的最短距离的点j
if(!vis[j]&&dis[j]<minn){
minn=dis[j];
tmp=j;//暂存j到tmp
}
}
vis[tmp]=1;//点tmp加入集合
for(int j=1;j<=n;++j){
if(map[tmp][j]+dis[tmp]<dis[j]){//如果存在点tmp到集合的距离加上点tmp到点j的距离 比未更新前集合到点j的距离更近,则更新集合到点j的距离
dis[j]=map[tmp][j]+dis[tmp];
}
}
}
cout<<dis[1];//输出点n到点1的距离
return 0;
}