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