dijstra算法代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q__y__L/article/details/52667772

dijstra.
G=(V,E)V2

  1. SSSS
  2. UUSv0SU

给出一个图,。

#include<iostream>
#include<vector>
#include<iomanip>



#define N 6
#define max 10000  //没有直接相连的点距离设为足够大的数




using namespace std;
int dist[N][N] = { {0,7,9,max,max,14},
{7,0,10,15,max,max},
{9,10,0,11,max,2},
{max,15,11,0,6,max},
{max,max,max,6,0,9},
{14,max,2,max,9,0} };
int main(int n, char** s)
{
    //显示一下矩阵,防止输入错误
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cout << setw(5)<<dist[i][j] << "  ";
        }
        cout << endl;
    }
    int minD[N];//用于保存源点到各点最短路径值
    bool final[N];//用于判定顶点是否已在最短集合S中
    int v0;//指定初始点
    int previous[N];//每个点只需要记得它的前一个点就可以顺藤模瓜找到源点。
    //初始化
    cout << "请输入初始节点编号:" << endl;
    cin >> v0;
    for (int i = 0; i < N; i++)
    {
        final[i] = 0;//一开始所有点都在不确定集合中
        minD[i] = dist[v0][i];//起始点到其他点的距离  
        previous[i] = v0;//所有点的初始前置点都是v0
    }
    minD[v0] = 0;//初始点直接加入
    final[v0]=1;
    int vert;//用于保存选出点的编号


    for (int i = 0; i < N ; i++)//开启主循环
    {
        int min = max;
        for (int w = 0; w < N; w++)//每次循环是从未确定点集合U中找到最短的点,每次都是从已更新的距离中选择
        {
            if (!final[w])//必须是从未确定的集合中选择
            {
                if (minD[w] < min)
                { 
                    vert = w;
                    min = minD[w];
                }

            }
        }

        final[vert] = 1;//将选出的点加入S集,然后要对未确定的点距离进行更新
        for (int i = 0; i < N; i++)
        {
            if (!final[i] && (min + dist[vert][i] < minD[i]))
            {
                minD[i] = min + dist[vert][i];
                previous[i] = vert;
                //这里稍微说一下:因为v0到i的最短路径是经过点vert的,所以vert此时是
                //点i的前驱顶点,如果在下次循环minD[i]被选中,则上一轮中的vert确为前驱点
                //,如果不是,则i的前驱为minD[i]被选中前的最后一个一次距离更新的中间点。


            }
        }
    }


    //打印结果
    for (int i = 0; i < N; ++i)
    {
        int temp = i;
        cout << "v0到" << i << "的最短距离为: " << minD[i] << "  final:" << final[i]<<"路径(逆序):"<<i;
        while(previous[temp] != v0)
        {

            cout << "-" << previous[temp];
            temp = previous[temp];

        }

        cout<<"-"<<v0<<endl;
    }

    return 0;
}

1
这里写图片描述

猜你喜欢

转载自blog.csdn.net/q__y__L/article/details/52667772
今日推荐