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] << " ";
}
}