我有一个简单的图表,我的任务是找到两个节点之间的最短路径。我已尽力阅读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
答案 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);
}