2016-11-29 62 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); 

然后,每当你更新的距离,更新的前身:

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

最后,你可以跟踪任何顶点的最短路径(向后)到源:

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"); 
} 
0

听起来像一个家庭作业问题。

如果这是一个DFS,那么存储路径数字的想法会很棒。不幸的是,Djikstra的算法并不像DFS那样自然地追踪路径;它只需要下一个最近的节点并更新距离值。在这方面它可能更类似于BFS。

你可以做的是当你更新到每个节点的距离,以某种方式存储你来自哪个节点(也许在你的iPair结构,如果你被允许,也许在地图/数组,如果你有方式来识别你的节点)。为了这篇文章,我将它称为“from”引用。然后,每次找到节点的较短路径时,也可以从引用更新该路径。

那么您如何找到给定节点的路径呢?简单:只需在结束节点处开始,然后按照“从”参考返回源。