1.アルゴリズムの紹介:
ダイクストラはダイクストラアルゴリズムとも呼ばれ、すべての重量側は負ではありませんこの場合の単一ソースの最短パス問題、貪欲アルゴリズム戦略を採用し、開始点に最も近く、訪問されていない頂点の隣接ノードへの各トラバーサル、最後まで伸びるまで。
2.疑似コードの説明:
1、初始化:设d[0]=0,其他d[i]=INF;//INF是一个很大的值,用来替代正无穷
2、循环V次(循环节点集个数次,也可以像图中表示,队列q会pop()V次)
{
在所有未标号结点中,选出d值最小的结点x;(第一次为源点,d为0)
给结点x标记;
对于从x出发的所有边(x,y),更新d[y] = min{
d[y], d[x]+w(x,y)
//对所有边松弛,可以不包括到已经标记过的节点的边,因为标记过得节点路径已经最短。
}
3.アルゴリズム図:
3.1。ノードセットSおよびQの変更プロセス:
3.2。パス検索の詳細なプロセス:
無向グラフ:
ダイクストラアルゴリズムを使用して、Aから始まる単一ソースの最短パスを見つけます。手順は次のとおりです。
4. C ++コード:
#include<stdio.h>
#define INF 0x3f3f3f3f //表示距离正无穷大,用来图的初始化
int map[1010][1010]; //较大的空间用于放图,存放两点间的权值
//假设图已经初始化完成,无连接点权重无穷大
int dis[1010]; //存放各点距起点的距离
int mark[1010]; //标记使用过的点
int v,m; //有v个点,编号为1~v,有m条边
void dijkstra(int s)
{
for(int i=1;i<=v;i++){
//初始化标记数组和距离数组
mark[i]=0; //0表示未使用此点
dis[i]=INF;
}
dis[s]=0; // 源点距离为0
int vir = 0;
int min; // 记录目前距离最短的点
for(int i=1;i<=V;i++){
// 执行V次循环
min = INF; // 每次寻找都要初始化
for(int j = 1;j<=V;j++){
// 寻找当前距离最小的点
if(!mark[j] && dis[j]< min ){
min = dis[j]; vir = j;}
}
mark[vir] = 1; // 标记找到的距离最小点
for(int j = 1;j<=V; j++){
// 对所有连接边进行松弛
if(!mark[j] && dis[j] > dis[vir]+map[vir][j]) ( dis[j] = dis[vir]+map[vir][j] )
}
}
}
参考資料:
1. Baidu百科事典- ダイクストラのアルゴリズム
2. 最短経路-ダイクストラアルゴリズムとフロイドアルゴリズム
総括する:
1.ダイクストラのダイクストラアルゴリズムは、ポジティブエッジのみを処理でき、ループを持つことができます。
2. BFSと同様に、各検索は現在のノードに接続されたノードのレイヤーのみを検索します;
3.最小スパニングツリーのプリムアルゴリズムと同様に、各検索の開始点は、検索ポイントとしてのセットSの外側の最小距離ポイントです。