码迷,mamicode.com
首页 > 编程语言 > 详细

dijkstra算法 - 最短路径算法

时间:2017-07-27 01:05:16      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:ace   jks   更新源   标记   ++   i++   还需   init   const   

2017-07-26 22:30:45

writer:pprp

dijkstra算法法则:设置顶点集合S,首先将起始点加入该集合,然后根据起始点到其他顶点的路径长度,

选择路径长度最小的顶点加入到集合S,根据所加入顶点更新源点到其他顶点的路径长度,然后再选取最小边的顶点;

实现:用邻接矩阵

我的理解:从某一点出发,找到与该点临近有路径的点,找到其中最短路径的点,将其标记,表示已经访问过了,

然后更新距离的数组(如果通过两步路径和要比一步的路要短),还需要在深刻理解一下;


 

代码如下:

#include <iostream>

using namespace std;

const int INF = 99999999;
int n;
int map[1001][1001];  //储存图
int visit[1001];   //设置访问标记
int d[1001];    //源点到各节点的最小距离


void init()
{
    cin >> n;
    for(int i = 1; i <= n ; i++)
        for(int j = 1; j <= n ; j++)
        {
            cin >> map[i][j];
            if(map[i][j] == 0)
                map[i][j] = INF;
        }
}

void Dijkstra(int x)  //从x点开始到其他源点的距离
{
    int i,j,Min,p;
    for(i =1; i<=n; i++)
        d[i] = map[x][i];  //初始化最小距离
    visit[x] = 1;    //标记为已访问过
    d[x] = 0;       //自身到自身为0
    for(i = 1; i < n; i++)
    {
        Min = INF;            //找最小边
        for(j = 1; j<=n; j++)  //找出总和最短路径
        {
            if(!visit[j]&&Min>d[j])
            {
                p = j;
                Min = d[j];
            }
        }
        visit[p] = 1;
        for(j = 1; j <= n; j++)
        {
            if(!visit[j]&&Min+map[p][j]<d[j])
                d[j] = Min+map[p][j];
        }
    }
    for(i = 1;i <= n ;i++)
      cout <<d[i]<<" ";
    cout << endl;
}

int main()
{
    init();
    Dijkstra(1);
    return 0;
}

 

dijkstra算法 - 最短路径算法

标签:ace   jks   更新源   标记   ++   i++   还需   init   const   

原文地址:http://www.cnblogs.com/ilovelianghui/p/7242456.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!