无向图最短路径问题 Dijkstra算法

无向图最短路径问题

思路:
具体的思路,半天也说不清楚,所以我在这里附上视屏讲解链接,里面的讲解十分清晰。
[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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43557810/article/details/88075306