Korean, Edit

C 言語の最短パス アルゴリズム (Floyd アルゴリズム)

上位カテゴリ : [C 言語] C 言語目次


1. さまざまな距離の概念

2. C 言語で実装された最短パス アルゴリズム


a. GitHub



1. (参考) 各種距離概念

距離関数: 距離を定義します


描画

タイプ 1: L1 距離


描画

タイプ 2: L2 距離: 三平方の定理を使用したユークリッド距離 (標準)


描画

タイプ 3: p ノルム


描画

タイプ 4: 内積

タイプ 5: リンケージメトリック: クラスター間の距離を定義します

タイプ 6: KL 距離 %80%20%EC%97%94%ED%8A%B8%EB%A1%9C%ED%94%BC,-(相対%20エントロピー%2C)(カルバック・ライブラー発散)

タイプ 7: ハミング距離: データ点ごとにバイナリ値を指定して、データ点間の距離を測定します。

タイプ 8: マハラノビス距離: データの分布を測定します。



2\。 C言語で実装された最短パスアルゴリズム

⑴ 問題の状況: たとえば、0 から 5 へのパスには 6 のコストが必要です。つまり、6 の距離を移動する必要があります。


描画

テーブル。 1. 問題の状況

⑵ C言語コード

「」c #include #include #define Count_Vertice 6 #define Far_Distance 2000

int W[頂点数][頂点数] = { // W[i][j] は i から j までの直接距離を表し、値が大きいほど直接移動できないことを示します {0, 遠距離, 2, 3, 3, 6}, {遠距離, 0, 遠距離, 4, 2, 遠距離}, {10, 2, 0, 5, 1, Far_Distance}, {遠い距離, 遠い距離, 4, 0, 遠い距離, 2}, {5, 9, 遠距離, 4, 0, 3}, {遠い距離, 遠い距離, 遠い距離, 4, 遠い距離, 0}, };

int D[頂点数][頂点数]; // D[i][j] には i から j までの最小距離が格納されます int P[頂点数][頂点数]; // P[i][j] は、i から j まで通過した最高次数の頂点を格納します

void フロイド(){ int i、j、k; for(i=0; i < Count_Vertice; i++) // 配列を初期化します for(j=0; j < Count_Vertice; j++){ P[i][j] = -1; D[i][j] = W[i][j]; } for(k=0; k < Count_Vertice; k++) for(i=0; i < Count_Vertice; i++) for(j=0; j < Count_Vertice; j++) if(D[i][j] > D[i][k] + D[k][j]){ /* kを経由することでD[i][j]が短くなった場合 */ D[i][j] = D[i][k] + D[k][j]; P[i][j] = k; } }

void Print_Path(int a, int b){ // Print_Path[i][j] の i と j は印刷されないことに注意してください if(P[a][b] != -1) { // P[a][b] = -1 “= 最短距離は a から b までの直線です Print_Path(a, P[a][b]); printf(“%d “, P[a][b]); Print_Path(P[a][b], b); } }

int main(int argc, char *argv[]){ フロイド(); int a、b; printf(“出発点と目的地を入力してください。(0 ~ %d)\n”, Count_Vertice - 1); scanf(“%d %d”, &a, &b); printf(“最短距離: %d\n”, D[a][b]); printf(“最短パス: “); printf(“%d “, a); Print_Path(a, b); if(D[a][b] != 0) printf(“%d”, b); // D[a][b] = 0

「= a = b 0を返します。 } 「」



入力: 2013 年 12 月 13 日 22:55

results matching ""

    No results matching ""