単一ソースの最短パスダイクストラアルゴリズム:正のエッジのみを処理でき、ループを持つことができます

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の外側の最小距離ポイントです。

おすすめ

転載: blog.csdn.net/qq_33726635/article/details/106521073