zoukankan      html  css  js  c++  java
  • dijkstra算法理解+模板

    2017-09-17 21:10:45

    writer:pprp

    看了看dijkstra算法,用自己语言总结一下主要过程吧,

    首先,明确这个算法用处是在于计算单源最短路径问题并且边权非负,给出一个起点可以找到其他点的最短路径

    复杂度为O(n^2)

    思想:贪心的做法,每次只看现在的最短路的部分,但是要记得更新已确定该点到其他点的距离

    总结一下,dijkstra的做法:
    需要 dis vis map 三个数组
    给出起点就可以找到到其他所有点的最短路
    1、初始化dis数组和起点的dis和vis
    2、进行N个点的N次循环
    3、从起点开始,找到距离最短的点
    4、然后将其dis和vis更改,
    5、更改该点相连的其他点的距离

    模板如下:

    const int maxn = 1010;
    const int INF = 0x3f3f3f3f;
    int mp[maxn][maxn];
    bool vis[maxn];
    int dis[maxn];
    
    void Dijkstra(int st)
    {
        for(int i = 1 ; i <= N; i++)//更新dis数组
        {
            dis[i] = mp[st][i];
        }
        vis[st] = 1;
        dis[st] = 0;
        int rec = -1;
        for(int i = 1 ; i < N ; i++)//起到了循环的作用
        {
            Min = INF;
            rec = -1;
            for(int j = 1; j <= N; j++)//找到当前的可以到达的最短距离的点
            {
                if(!vis[j] && Min > dis[j])
                {
                    rec = j;
                    Min = dis[j];
                }
            }
            if(rec == -1)return ;
            vis[rec] = 1;
            for(int j = 1; j <= N; j++)//更新该点连接到的其他的点
            {
                if(!vis[j] && mp[rec][j] != INF && dis[rec] + mp[rec][j] < dis[j])
                    dis[j] = mp[rec][j] + dis[rec];
            }
        }
    }

    使用方法:

     for(int i = 0 ; i < maxn; i++)
            for(int j = 0 ; j < maxn; j++)
                mp[i][j] = INF;
        memset(vis,0,sizeof(vis));
        for(int i = 0 ; i < T ; i++)
        {
            cin >> x >> y >> v;
            if(v < mp[x][y])//去重
                mp[x][y] = mp[y][x] = v;
        }
        Dijkstra(N);
        for(int i = 1; i < N ; i++)
            cout << dis[i] << " ";
        cout << endl;

     

  • 相关阅读:
    IsPostBack
    判断客户端.net版本
    js 汉字转换成拼音 转载
    观察者模式
    常用的js阻止冒泡的方法
    jquery中事件的绑定
    uclinux编译 skyeye运行
    dotNet学习之路 Struct与Class异同点
    dotNet学习之路 Delegate内部原理
    设计模式之旅(策略模式) 十号刚发工资的博友们,赶紧跟我一起算算你们的老板有没有给你少发工资。。。
  • 原文地址:https://www.cnblogs.com/pprp/p/7537939.html
Copyright © 2011-2022 走看看