代码
#include<iostream>
#include<cstring>
using namespace std;
#define Inf 0x3f3f3f3f
int map[1001][1001];
int vis[1001],dis[1001];
int n,m;
void init()
{
memset(map,Inf,sizeof map);
for(int i=1;i<=n;i++)
map[i][i]=0;
}
void getmap()
{
int x,y,z;
for(int i=1;i<=m;i++)
{
cin>>x>>y>>z;
if(map[x][y]>z)
{
map[x][y]=z;
map[y][x]=z;
}
}
}
void dijkstra(int root)
{
memset(vis,0,sizeof vis);
for(int i=1;i<=n;i++)
{
dis[i]=map[root][i];
}
vis[root]=1;
for(int t=1;t<=n;t++)
{
int min=Inf,tmp;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&dis[i]<min)
{
min=dis[i];
tmp=i;
}
}
vis[tmp]=1;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&map[tmp][i]+dis[tmp]<dis[i])
{
dis[i]=map[tmp][i]+dis[tmp];
}
}
}
}
int main()
{
cin>>n>>m;
init();
getmap();
dijkstra(6);
for(int i=1;i<=n;i++)
cout<<dis[i]<<" ";
}
说明
本题参考了这篇文章——Dijkstra算法图文详解,但原文章有一些漏洞,我对其进行了修改,得到了这个优化后的代码