2016-11-29 12 views
-1

これを変更して最短経路の経路を表示する方法はありますか?例えば、私が(3,1)、(3,0)、(4,3)、(2,1)のような数字のリストを持っていたならば、4から1への出力は4-> 3,3 - > 1最短経路変更

// Prints shortest paths from src to all other vertices 
void Graph::shortestPath(int src) 
{ 
    // Create a priority queue to store vertices that 
    // are being preprocessed. This is weird syntax in C++. 
    // Refer below link for details of this syntax 
    // http://geeksquiz.com/implement-min-heap-using-stl/ 
    priority_queue< iPair, vector <iPair> , greater<iPair> > pq; 


    // Create a vector for distances and initialize all 
    // distances as infinite (INF) 
    vector<int> dist(V, INF); 

    // Insert source itself in priority queue and initialize 
    // its distance as 0. 
    pq.push(make_pair(0, src)); 
    dist[src] = 0; 

    /* Looping till priority queue becomes empty (or all 
     distances are not finalized) */ 
    while (!pq.empty()) 
    { 
     // The first vertex in pair is the minimum distance 
     // vertex, extract it from priority queue. 
     // vertex label is stored in second of pair (it 
     // has to be done this way to keep the vertices 
     // sorted distance (distance must be first item 
     // in pair) 
     int u = pq.top().second; 
     pq.pop(); 

     // 'i' is used to get all adjacent vertices of a vertex 
     list< pair<int, int> >::iterator i; 
     for (i = adj[u].begin(); i != adj[u].end(); ++i) 
     { 
      // Get vertex label and weight of current adjacent 
      // of u. 
      int v = (*i).first; 
      int weight = (*i).second; 

      // If there is shorted path to v through u. 
      if (dist[v] > dist[u] + weight) 
      { 
       // Updating distance of v 
       dist[v] = dist[u] + weight; 
       pq.push(make_pair(dist[v], v)); 
      } 
     } 
    } 

    // Print shortest distances stored in dist[] 
    printf("Vertex Distance from Source\n"); 
    for (int i = 0; i < V; ++i) 
      printf("%d \t\t %d\n", i, dist[i]); 
    } 

(上記の例を使用して)4,3,3,1のようなパスの番号を格納する配列に入れて最高のアイデアのように思えるが、私はどこの配列を挿入するために知っていませんこのコードでそれを行う。

答えて

0

distベクトルの各頂点の距離を保存するのと同じように、最後に更新した先行頂点をpredecessorというベクトルに保存します。

vector<int> dist(V, INF); 
vector<int> predecessor(V, 0); 

次に、距離を更新するたびに、先行更新:

printf("Vertex Distance from Source  shortest path from source\n"); 
for (int i = 0; i < V; ++i) 
{ 
     printf("%d \t\t %d\t\t", i, dist[i]); 
     int j = i; 
     do 
     { 
      printf("%d,", j); 
      j = predecessor[j]; 
     } while(j != src); 
     printf("\n"); 
} 

dist[v] = dist[u] + weight; 
predecessor[v] = u; 

を最後に、ソースへの最短パス(後方)頂点いずれかのトレースすることができ

0

音が宿題に似ています。

DFSの場合は、パスの番号を保存することをおすすめします。残念なことに、DjikstraのアルゴリズムはDFSのようにパスを自然に追跡しません。単に次の最も近いノードを取り、距離値を更新するだけである。それはおそらくその点でBFSに似ています。

あなたができることは、各ノードの距離を更新するときに、どのノードから来ているのかを格納しておくことです(おそらく、あなたのマップの場合はマップ/配列内に可能でしょうか?iPair構造体あなたのノードを識別する方法)。私はこの投稿のために "from"参照と呼んでいます。次に、ノードへのパスを見つけるたびに、そのノードを参照から更新することもできます。

どのノードにどのようにパスがあるのでしょうか?シンプルなもの:エンドノードから始まり、 "from"参照をソースに戻します。