最短経路のディジェストラ(Dijkstra)アルゴリズム
1683 ワード
用事がないので、前の簡単なアルゴリズムを整理します.例えば、問題のように、今回は最短経路のDijkstraアルゴリズムを整理します.Dijkstraアルゴリズムは貪欲戦略に基づくアルゴリズムであり,単一ソース点経路を計算する際に比較的実用的である.図論のこれらのコードのテストデータは冗長なので、私はファイルを読む形式でこれらの値を取得して、読者は参考にすることができます.コードは次のとおりです.
テストデータはinput.に保存すべきである.txt、テストデータは以下の通りです.
5 7 0 1 10 0 3 30 0 4 100 1 2 50 2 4 10 3 2 20 3 4 60 0 1
ここで、第1行は2つのデータを含み、n,lineはそれぞれ頂点数と辺数を表し、次にline行データは対応する辺と重み値を表し、最後の行の2つのデータstartとendはそれぞれ開始点と終了点を表す.
#include
#include
using namespace std;
const int N = 5;
const int Max = 65535;
int Dijkstra(int start, int end, int G[][N]);
int main(){
int n, line;
freopen("input.txt", "r", stdin);
cin >> n >> line;
int G[N][N] = {0};
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
G[i][j] = Max;
}
}
int p, q, length;
for (int i = 0; i < line; i++){
cin >> p >> q >> length;
G[p][q] = length;
G[q][p] = length;
}
int start, end;
cin >> start >> end;
cout << Dijkstra(start, end, G);
return 0;
}
int Dijkstra(int start, int end, int G[][N]){
int *s = new int[N];
int *d = new int[N];
//
for (int i = 0; i < N; i++){
s[i] = 0;
d[i] = G[start][i];
}
s[start] = 1;
d[start] = 0;
int select = start, temp;
for (int i = 0; i < N; i++){
temp = Max;
//
for (int j = 0; j < N; j++){
if (temp > d[j] && s[j] == 0){
temp = d[j];
select = j;
}
}
s[select] = 1;
//
for (int k = 0; k < N; k++){
int newvalue = G[select][k] + d[select];
if (newvalue < d[k]){
d[k] = newvalue;
}
}
}
return d[end];
}
テストデータはinput.に保存すべきである.txt、テストデータは以下の通りです.
5 7 0 1 10 0 3 30 0 4 100 1 2 50 2 4 10 3 2 20 3 4 60 0 1
ここで、第1行は2つのデータを含み、n,lineはそれぞれ頂点数と辺数を表し、次にline行データは対応する辺と重み値を表し、最後の行の2つのデータstartとendはそれぞれ開始点と終了点を表す.