如何使用广度优先搜索确定是否可以在有向图中到达顶点
How to determine if a vertex can be reached in a directed graph using breadth first search
当尝试确定有向图中的顶点是否可访问时,我使用广度优先搜索将图从源顶点遍历到目标顶点。但是,当我比较我在 bfs 期间从队列中弹出的内容(应该是我访问过的每个顶点(时,它只返回 false,在任何情况下都永远不会返回 true,尽管我知道图形在某些情况下可以返回 true,有些人可以帮助我吗?
这是我的代码
template <typename E>
bool Graph<E>::isReachable(E fromKey, E toKey) const
{
Edge* tmpEdge;
Edge* pred;
Edge* edgeWalk;
Vertex* walkPtr;
Vertex* toPtr;
Vertex* tmp;
Vertex* tmpFrom;
Vertex* tmpTo;
queue<Vertex*> q;
/* find source vertex */
tmpFrom = first;
while (tmpFrom != NULL && fromKey > tmpFrom->data)
tmpFrom = tmpFrom->pNextVertex;
if (tmpFrom == NULL || fromKey != tmpFrom->data)
return false;
/* locate destination vertex */
tmpTo = first;
while (tmpTo != NULL && toKey > tmpTo->data)
tmpTo = tmpTo->pNextVertex;
if (tmpTo == NULL || toKey != tmpTo->data)
return false;
walkPtr = first;
while (walkPtr != NULL)
{
walkPtr->processed = 0;
walkPtr = walkPtr->pNextVertex;
}
walkPtr = first;
while (walkPtr != NULL)
{
if (walkPtr->processed < 2)
{
if (walkPtr->processed < 1)
{
q.push(walkPtr);
walkPtr->processed = 1;
}
}
while (!q.empty())
{
tmp = q.front();
q.pop();
tmp->processed = 2;
edgeWalk = tmp->pEdge;
while (edgeWalk != NULL)
{
toPtr = edgeWalk->destination;
if (toPtr->processed == 0)
{
toPtr->processed = 1;
q.push(toPtr);
}
edgeWalk = edgeWalk->pNextEdge;
}
if (tmpTo->processed = 2)
return true;
}
return false;
}
}
您的顶点列表是否正确排序? 如果不是(看起来很可能(,您将无法找到 from 或 to 键并返回 false。 我说"可能",是因为底部的循环有几个问题,其中一个(tmpTo->processed = 2
;你应该使用==
(将导致函数一直返回true。
相关文章:
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- C++创建指向有向图中节点的指针数组
- 如何仅在 2 个节点之间获取最短路径,给定邻接列表有向图?
- 有向图 - 如何计算图中彼此顶点可到达的顶点数?
- C++计算有向图中的最短路径
- 使用非递归 DFS 检测有向图中的周期
- 如何将这些节点连接为有向图
- 如何使用广度优先搜索确定是否可以在有向图中到达顶点
- 在有向图中精确访问所有节点一次
- 在有向图中查找第二条最短路径
- 关于如何处理有向图的一个想法
- 找到有向图C 的最短路径
- 分析输入文件以创建有向图C++
- 在使用无序多映射实现的有向图中查找循环
- 如何找到在c++中实现的有向图的所有路径作为邻接列表
- Boost有向图:比较顶点的边
- 如何获得有向图上给定顶点的输入边
- 给定一组顶点,如何生成具有几乎最少边量的强连接有向图
- 由向量的向量构成的有向图中的可达顶点
- 检查顶点之间的平行边:edge_range不适用于有向图