グラフの最短経路アルゴリズム
//ダイクストラのアルゴリズム:1つの頂点から他の頂点への最短経路を見つける
//フロイトアルゴリズム:頂点のペア間のパス
1 #include <iostream> 2 using namespace std; 3 // 最短パス 4 5 // Dijstraのアルゴリズム:頂点から残りの頂点への最短パスを見つける 6 void printfPath(int path []、int a) { // 出力パスアルゴリズム 7 int stack [maxsize]、top = -1 ; 8 while(path [a]!= -1 ){ 9 stack [++ top] = path [a]; 10 a = path [a ]; 11 } 12 while(top!= -1 ){ 13 cout << stack [top-] << " " ; 14 } 15 cout < endl; 16 } 17 void Dijkstra(MGraph g、int v、int dist []、int path []){ 18 int set [maxsize]; 19 int k、min; 20 for(int i = 0 ; i <gn; i ++){ // 初始化 21 dist [i] = g.edges [v] [i]; 22 セット [i] = 0 ; 23の 場合(g.edges [v] [i] < INF){ 24 path [i] = v; 25 } else { 26 path [i] = -1 ; 27 } 28 } 29 set [v] = 1 ; 30 パス[v] = -1 ; 31 for(int i = 0 ; i <gn- 1 ; i ++){ // 两层循環环 32 min = INF; 33 for(int j = 0 ; j <gn; j ++){ //次の頂点を見つけてセット 34に 入れますif(set [j] == 0 && dist [j] < min){ 35 k = j; 36 min = dist [j]; 37 } 38 } 39 set [k] = 1 ; 40 for(int j = 0 ; j <gn; j ++){ // 最短パスを更新 41 if(set [j] == 0 && dist [j]> dist [k] + edge [k] [j]){ 42 距離[j] =距離[k] + エッジ[k] [j]; 43 path [j] = k; 44 } 45 } 46 } 47 } 48 49 // フロイトアルゴリズム:頂点のペア間のパス 50 void printPath(int u、int v、int path [] [maxsize]) { // 出力パス 51 if(path [u] [v] ==- 1 ){ 52 cout << u << " -> " << v << endl; 53 return ; 54 } 55 else { 56 intmid = path [u] [v]; 57 printPath(u、mid、path); 58 printPath(mid、v、path); 59 } 60 } 61 void Floyd(MGraph g、int path [] [maxsize]){ // 复杂度为N ^ 3; 62 int A [maxsize] [naxsize]; 63 for(int i = i; i <gn; i ++){ //対A [] []和path [] []初始化 64 for(int j = 0 ; j <gn; j ++ ){ 65 A [i] [j] = g.edges [i] [j]; 66 パス[i] [j] = -1; 67 } 68 } 69 for(int k = 0 ; k <gn; k ++){ // 3層ループは、Kを中間点としてすべてのi、jの検出と変更を完了します。 70 for(int i = 0 ; i <gn; i ++ ){ 71 for(int j = 0 ; j <gn; j ++ ){ 72 if(A [i] [j]> A [i] [k] + A [k] [j]){ 73 A [i] [j] = A [i] [K] + A [k] [j]; 74 パス[i] [j] = k; 75 } 76 } 77 } 78 } 79 }