図-最短パス(データ構造)

グラフの最短経路アルゴリズム

//ダイクストラのアルゴリズム: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      forint 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      forint i = 0 ; i <gn- 1 ; i ++){ // 两层循環环
32          min = INF;
33          forint j = 0 ; j <gn; j ++){ //次の頂点を見つけてセット
34に             入れますifset [j] == 0 && dist [j] < min){
 35                  k = j;
 36                  min = dist [j];
 37              }
 38          }
 39          set [k] = 1 ;
 40          forint j = 0 ; j <gn; j ++){ // 最短パスを更新
41              ifset [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      forint i = i; i <gn; i ++){ //対A [] []和path [] []初始化
64          forint j = 0 ; j <gn; j ++ ){
 65              A [i] [j] = g.edges [i] [j];
66              パス[i] [j] = -1;
 67          }
 68      }
 69      forint k = 0 ; k <gn; k ++){ // 3層ループは、Kを中間点としてすべてのi、jの検出と変更を完了します。
70          forint i = 0 ; i <gn; i ++ ){
 71              forint 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  }

 

おすすめ

転載: www.cnblogs.com/aiqinger/p/12707249.html