首页 > 编程语言 > 详细

算法总结——Dijkstra

时间:2015-03-20 21:48:54      阅读:335      评论:0      收藏:0      [点我收藏+]

Dijkstra:

复杂度:O(n^2)

用途:求起点到终点的最短路径,不需要吧每个点走到

适用条件:

原理:利用邻接矩阵,用d数组记录最小值,用p标记是否用过这组数据。

步骤:一大for,两小for,第一个小for用来的出当前的d中的最小值,为了得到下标,第二个小for用来更新map最小值,得出结果,循环整张地图n次

模板:

#include<cstdio>
#include<cstring>
using namespace std;
const int inf = 0x3f3f3f3f, MAX = 300;
int min1,x,y,z,k,n,m;
int map[MAX][MAX],p[MAX],d[MAX];
void dijkstra(int map[][MAX],int n)
{
    for(int i = 1; i <= n ; i++)
        d[i] = inf;
    d[1] = 0;
    for(int i = 1; i <= n ; i++){
            min1 = inf;
          for(int j = 1; j <= n ; j++){
                if(!p[j] && d[j] < min1){
                     min1 = d[j];
                     k = j;
                }
          }
          p[k] = 1;
          for(int j = 1; j <= n ; j++){
                if(!p[j] && d[j] > d[k] + map[k][j])
                    d[j] = d[k] + map[k][j];
          }
    }
    printf("%d",d[n]);
}
int main(){
    memset(p,0,sizeof(p));
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= n ; j++)
          map[i][j] = inf;
    for(int i = 1; i <= m ; i++){
        scanf("%d%d%d",&x,&y,&z);
        map[x][y] =z;
    }
    dijkstra(map,n);
    return 0;
}

 

算法总结——Dijkstra

原文:http://www.cnblogs.com/zero-begin/p/4354466.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!