#include<iostream>
#include<cstdio>
#include<string.h>
#define inf 0x3f3f3f
using namespace std;
void dijkstra();
int p[101][101];
int dis[101];
int vis[101];
int n,m;
void init()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
p[i][j]=p[j][i]=inf; //注意一开始各点之间距离要初始化为无穷大
}
memset(vis,0,sizeof(vis));
}
int main()
{
while(scanf("%d%d",&n,&m),m+n)
{
int i;
init();
for(i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
p[a][b]=c;
p[b][a]=c;
}
dijkstra();
cout<<dis[n]<<endl;
}
}
void dijkstra()
{
int i;
for(i=1;i<=n;i++)
dis[i]=inf; //最短距离数组也要初始化为最大
dis[1]=0; //起点最短距离为1,不用管和起点直接连接的点的存储,和其他点的存储方式没区别,都在下面遍历所有点找距离更小的那个过程中
int u; //有一个找最近点的变量
for(i=1;i<=n;i++) //注意是两重循环,第一层保证先遍历所有的点,第二层再遍历找最近的和更新距离值
{
u=-1; //一开始没有最近点,就随便找一个,以便后续比较
int j;
for(j=1;j<=n;j++)
if(!vis[j]&&(u==-1||dis[j]<dis[u]))
u=j;
vis[u]=1;
for(j=1;j<=n;j++)
if(!vis[j]&&dis[j]>dis[u]+p[u][j])
dis[j]=dis[u]+p[u][j];
}
}
迪杰斯特拉代码部分及要注意的部分
猜你喜欢
转载自blog.csdn.net/weixin_42165786/article/details/81385088
今日推荐
周排行