无向图最短路径问题
思路:
具体的思路,半天也说不清楚,所以我在这里附上视屏讲解链接,里面的讲解十分清晰。
[Djkstra算法讲解](http://www.iqiyi.com/w_19ru9nrxol.html
代码实现及讲解
#include <iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
int mp[1001][1001]; //数组mp[][],储存两点的距离
int vis[1001]; //表示某点是否参观,0 否 1 是
int dis[1001]; //存储从原点到某点的最短距离
int Max = 1e9; //定义一个很大的数,如果两点之间的距离为该值,表示两点之间没导通
int n,m;
int main()
{
while (scanf("%d%d",&n,&m) != EOF && m+n)
{
for (int i=0;i<n;i++) //对 mp[][]初始化
for (int j=0;j<n;j++)
{
if (i == j) //同一点之间的距离为0
mp[i][j] = 0;
else
mp[i][j] = Max; //否则默认为两点不导通
}
for (int i=1;i<=m;i++) //输入两点及之间的距离
{
int x,y,z;
cin>>x>>y>>z;
mp[x][y] = z;
mp[y][x] = z;
}
for (int i=0;i<=n;i++) //初始化vis[] dis[],默认为每一点都没有参观且每点到原点的距离都为无穷大
vis[i] = 0,dis[i] = Max;
int use; //定义use 表示目前参观的点
dis[1] = 0; // 1 到 原点的距离为 0 ,也就是自己到自己
for (int i=1;i<=n;i++) //循环遍历 n 次,因为有n 个点,每次只能参观 1 个点
{
int min_num = Max;
//这个循环的功能就是找到为参观的节点中dis[]最小的那个点
//这里注意,是先知道dis[j]到原点的距离,才能判断 j 点是否参观
for (int j=1;j<=n;j++)
{
if (vis[j] == 0 && dis[j] < min_num)
{
use = j;
min_num = dis[j];
}
}
vis[use] = 1; //查找到,则参观该点
for (int j=1;j<=n;j++) //遍历所以未参观的点且未参观的点与该参观点导通,求出未参观点与参观点导通的点间最小值,则求出 j 点到原点的距离。
if (mp[use][j] && vis[j] == 0 && dis[j] > dis[use] + mp[use][j])
dis[j] = dis[use] + mp[use][j];
}
for (int i=1;i<=n;i++)
printf("%d\t",dis[i]);
}
return 0;
}