1.理解:https://blog.csdn.net/A599677743/article/details/38610841
2.Dijkstra模板
void Dijkstra(int n,int x)
{
int min,k,i,j;
memset(visited,0,sizeof(visited));//初始化visited数组值为0;
for (i=1;i<=n;i++)
//**dis[i]表明当前状态下,U中各点距离x点距离的最小值.U中顶点j的距离为
//(s,j)的长度,然后s和j不相邻,则v的距离为∞
dis[i]=map[x][i];
visited[x]=1;//将顶点x加入到S中
for (i=1;i<=n;i++)
{
min=INF;//min先赋值为最大值
for (j=1;j<=n;j++)
{
//如果j点不在S中,且j点到x点距离是U中点到x点距离的最小值,**按从小到大顺序来
//以便后面更新dis时取的是最小值
if(!visited[j]&&dis[j]<min) //最小值,与第2个if相对应
{
min=dis[j];
k=j;//从U中选出"距离最短的顶点k"
}
}
visited[k]=1;//将k点加入到S中
for (j=1;j<=n;j++)
{
//**遍历U中各点,如果x点现在经k点到U中j点距离小于x点之前到U中j点距离就更新x点
//到U中点距离
if(!visited[j]&&(dis[k]+map[k][j])<dis[j]) //以k为中间值刷新,dis[k]为递增后值,否则可能会到失误较小点距离累加过多。
dis[j]=dis[k]+map[k][j];
}
}
}