dijkstra的基本算法以及堆优化

dijkstra

基本算法 O(n^2)
是使用临接矩阵储存的,部分边可能会被访问两次,如果采用临界表的话边是但方向储存的,只需要访问一次,可以做略微的优化。

//
//  main.cpp
//  dijkstra
//
//  Created by 陈冉飞 on 2019/12/10.
//  Copyright © 2019 陈冉飞. All rights reserved.
//

#include <iostream>
using namespace std;
#define maxn 10010
#include <cstring>
#define cl(a,b) memset(a,b,sizeof(a))
int mp[maxn][maxn],d[maxn],vis[maxn],n,m,a,b,c; //n为点数,m为线段数
#define INF 1<<29

void dijkstra(){
    for (int i = 1; i <= n; i++) d[i] = mp[1][i];
    for (int i = 1; i <= n; i++) {
        int v = 0,tem = INF;
        for (int j = 1; j <= n; j++)
            if (!vis[j] && d[j] < tem)
                tem = d[v=j];
        vis[v] = 1;
        for (int j = 1; j <= n; j++)
            if (!vis[j] && d[j] < d[v]+mp[v][j]) d[j] = d[v]+mp[v][j];
    }
    printf("%d\n",d[n]);
}

int main(int argc, const char * argv[]) {
    while (~scanf("%d%d",&n,&m)) {
        //init
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                if (i == j) mp[i][j] = 0;
                else mp[i][j] = INF;
        for (int i = 0; i < m; i++) {
            scanf("%d%d%d",&a,&b,&c);
            mp[a][b] = mp[b][a] = c;
        }
        dijkstra();
    }
    return 0;
}

利用堆优化,用二维临界表储存信息,放在一个向量表中,通过每个节点push新的结构体节点,包含索引和到那个点的距离等数据,然后来计算获得图表信息。在init的时候要把自己到自己d数组的值初始化为零,在堆优化dijkstra函数中,把所有节点也以结构体储存,通过类似广搜的结构,通过在每次遍历该节点的所有情况的时候,把比当前好的情况都push进去队列,(用一个维护最值的优先队列,重载运算符,在每次被push进入队列的时候就自动放在队首)

//the program is debuging
发布了95 篇原创文章 · 获赞 19 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43345204/article/details/103560779