簡體   English   中英

C++ 中的“擴展”深度優先搜索

[英]"Extended" depth-first search in C++

我知道如何在 C++ 中實現深度優先搜索算法,但我需要一個“擴展版本”。 所以,我有一張地圖

map<int, map<int,int> > tree;

對於任何頂點,它返回一個以相鄰頂點作為鍵和(對我的程序很重要)邊緣索引作為值的映射。 樹的根是第一個 (1) 頂點。 所以,這是我的代碼:

stack<int> s;
for(const auto &pair : tree[1]) s.push(pair.first);
while(!s.empty()) {
    if(!visited[s.top()]) {    //it's just bool array
        roads[s.top()] = {0}; // ???
        for(const auto &pair : tree[s.top()]) s.push(pair.first);
    }
    s.pop();
}

我需要做的是創建一個向量向量,其中對於每個頂點,我都有一個完整的路徑(表示為邊緣索引)。

例如對於這樣的圖:

       1
      /  \
(i=2)/    \(i=1)
    /      \
   2       3
           /\
          /  \
    (i=3)/    \(i=4)
        /      \
       4        5

我想要這樣的東西:

vector< vector<int> > roads = {{},{},{2},{1},{1,3},{1,4};

因為roads[0]不存在, roads[1]也不存在,並且對於每個其他路徑,我們都將路徑表示為邊緣索引。

編輯

換句話說,我想做什么:對於給定樹中的每個頂點,我想知道從根到該頂點的路徑。 這棵樹中的每條邊都有自己的編號,因此路徑將表示為向量或集合(為簡單起見,我根本不關心邊的順序)。

“無環圖”也稱為樹。

您想要一個包含所有邊標簽序列的列表,這些邊標簽表示從根到某個頂點的路徑?

遍歷的偽代碼(我想這可以作為preorder遍歷):

void collect(node, //current node
    labels, //labels of edges leading to node
    &paths //all the paths collected so far, writeable, contains results
) {
    paths.add(labels);
    foreach ((neighbor_node, edge_name) in (unvisited neighbors of node)) {
        labels.add(edge_name);
        collect(neighbor_node, labels, paths);
        labels.remove(edge_name);                
    }
}

start with collect(root, empty_list, empty_list);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM