C ++実装Dijstraアルゴリズム(単一始点最短経路アルゴリズム)

1 Dijstra図アルゴリズムは、頂点の残りの頂点までの最短経路であります

アルゴリズムのDijstra思想:頂点の集合は、2つのT及びSが設けられており、頂点図面に格納された集合Sは、最短経路を発見し、Tのセットが残り図頂点に格納され、集合Sが唯一のソースV0を初期状態に含まれ、セットSに頂点vに組み込まれたセットT頂点V0最短経路長を選択していき、頂点の集合Sは、それぞれの新しいは、頂点V0は最短経路長値T頂点に設定されるように改変組み込ま

要約すると、私は2つのステップがある感じ。

頂点への最短パスの残りの部分に①選択されたソース頂点

②各頂点が、残りの頂点に光源からのパスを更新する必要があり、各頂点が追加されるように、それは経路の作用によって頂点の残りの頂点にソースを引き起こすことが可能であることは、このようなパス0-3のソースとして、短くなる選択します図4は、しかし、次の3つの短いパスの後に組み込まれている最短パスノード1の3つの頂点に更新する必要が始まりました

2.私はDijstraプリムアルゴリズム及び最小スパニングツリーアルゴリズムは非常に似ていると感じ、プログラミングの違い:プリムアルゴリズムD []現在の頂点の最短経路に頂点を残りのレコードの配列である、アルゴリズムレコードはソースDijstra最短経路の頂点の残りの部分へのポイントは、これは、配列が同じでない場合、我々は、さらに、それらの概念を理解するための2つのアルゴリズムを比較することができる差分更新D []の値になります

ここで右への具体的な例は次のとおりです。

ようにソース頂点0が最初の頂点0と接触して頂点を選択する場合、それは頂点の接触経路は、点源に達する前よりも短いかどうか0から頂点の循環中に決定され、それが経路に見出すことができるなってきていますそれはD []配列は、次のソースに対応する3つの頂点は、頂点を残りの最短経路を選択し更新する頂点1,3,4に達するまでパスがないので、短い、頂点はパス0-1に見ることができます以前のソースが短く見出されるよりも頂点3と接触して見出すことができる最短は、そう一つの頂点を選択し、上記の手順を繰り返しており、それは、パスが短い3 3か否パスの頂点を頂点と判定されそう更新するので、残りの頂点は、同じ理由であります

次のようにテストデータは以下のとおりです。

6 8 0
0 1 1 
0 3 4 
0 4 4 
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
#include<cstdio>
#include<iostream>
using namespace std;
const int maxSize = 1000;
const int INF = 100000000;
int n, m, s, G[maxSize][maxSize];
int d[maxSize];
bool vis[maxSize] = {false};

void Dijstra(int s){
	fill(d, d + maxSize, INF);
	d[s] = 0;
	for(int i = 0; i < n; i++){
		int u = -1, min = INF;
		for(int j = 0; j < n; j++){
			if(vis[j] == false && d[j] < min){
				u = j;
				min = d[j];
			}
		}
		if(u == -1) return;
		vis[u] = true;
		for(int v = 0; v < n; v++){
			if(vis[v] == false && G[u][v] != INF && d[u] + G[u][v] < d[v]){
				d[v] = d[u] + G[u][v];
			}
		}
	}	
}

int main(void){
	int u, v, w;
	cin >> n >> m >> s;
	//初始化二维数组 
	fill(G[0], G[0] + maxSize * maxSize, INF);
	for(int i = 0; i < m; i++){
		cin >> u >> v >> w;
		G[u][v] = w;
	}
	Dijstra(s);
	for(int i = 0; i < n; i++){
		cout << d[i] << " ";
	}
}

 

おすすめ

転載: blog.csdn.net/qq_39445165/article/details/93192203