我有一个简单的图表,我的任务是找到两个节点之间的最短路径。我已经尽力阅读了 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)
我正在尝试通过我在维基百科上找到的伪代码来实现 BFS,但我没有得到它。我的邻接列表存储在一个向量中:vector<vector <vertex> > adjList;
vertex
is a struct of two 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