C ++解决BFS以找到最短路径的麻烦

时间:2013-03-08 01:19:09

标签: c++ breadth-first-search adjacency-list

我有一个简单的图表,我的任务是找到两个节点之间的最短路径。我已尽力阅读BFS伪代码和示例,但它不是单击。

我的节点存储在邻接列表中(目前我不关心边缘权重) 这是数据的可视化:第一列是向量元素,它左边的行是另一个向量。向量元素编号表示相应节点的编号。

=====================================
0  |  (1, 100), (3, 50), (7, 100)
1  |  (0, 100), (4, 50), (5, 10) 
2  |  (3, 1000), (4, 200), (6, 1000) 
3  |  (0, 50), (2, 1000) 
4  |  (1, 50), (2, 200), (6, 100) 
5  |  (1, 10), (6, 50), (7, 2000) 
6  |  (2, 1000), (4, 100), (5, 50) 
7  |  (0, 100), (5, 2000)

我正在尝试通过wikipedia上找到的伪代码实现BFS,但我没有得到它。我的相关列表存储在向量中:vector<vector <vertex> > adjList; vertex是两个int的结构1)node和2)weight(同样我'我现在并不真正关心权重,但是我将这种结构设置以这种方式稍后进行修改)

我的实施非常基础:

vector<vector <vertex> > adjList;      // the vector adjacency list

// the start and end vertices are passed into the function
int startV;     //num of start node
int endV;       //num of destination node

bool visited = false, done = false;    //control         

vector<int> marked, path;              // holds visited and final path

Queue<int> Q;                          // Q for BFS
Q.push(startV);                        // enqueue BFS

while (!Q.empty() && !done) {

    int t = Q.front(); Q.pop();        // mark and pop(back)
    marked.push_back(t);               // push back start node onto marked

    if (t == endV)                     // if t is our destination
        done = true;                   // done, get out of here

    size_t adjE = adjList[t].size();   // degree of this node

    for (int i = 0; i < adjE; i++) {

        int u = adjList[t][i].node;    // visit each adjacent node

        for (int j = 0; j < marked.size(); j++) {

           if (marked[j] == u)         // test if node has been marked
               visited = true;  
           }
                                       // check if this node has
           if (!visited) {             // already been visited
              marked.push_back(u);     // if not enqueue
              Q.push(u);
           }
        }
    }
}

我知道我的实施有问题。我只是没看到是什么。

更新 我通过使用多图方法解决了这个问题。详细说明如下:Traverse MultiMap to Find Path from a Given Value to a Given Key

1 个答案:

答案 0 :(得分:0)

我认为您查找visited个节点的逻辑不正确。尝试

...
int u = adjList[t][i].node;

visited = false;
for (int j = 0; j < marked.size(); j++) {
    // std::find() does essentially all this for you. Check it out.
    if (marked[j] == u) {
        visited = true;
    }
}

if (!visited) {
    marked.push_back(u);
    Q.push(u);
}