gpt4 book ai didi

c++ - 如何使用广度优先搜索确定是否可以在有向图中到达顶点

转载 作者:太空宇宙 更新时间:2023-11-04 13:04:22 25 4
gpt4 key购买 nike

当尝试确定有向图中的顶点是否可达时,我使用广度优先搜索从我的源顶点遍历该图到目标顶点。但是,当我比较我在 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++ - 如何使用广度优先搜索确定是否可以在有向图中到达顶点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43055468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com