当前位置: 首页 > 知识库问答 >
问题:

BFS从给定节点开始,到达所有节点

欧浩淼
2023-03-14

我有一个场景

  1. 我想从一个特定的节点(比如ID:7)开始运行BFS
  2. 如果有无法从该节点访问的节点,我想重新启动BFS(使用任何剩余节点),直到访问图的所有顶点

到目前为止,我得到的是从节点0开始并用另一个未访问的顶点重新启动的代码(部分):

void BFS()
{
    // Mark all the vertices as not visited
    bool *visited = new bool[V];
    for(int i = 0; i < V; i++)
        visited[i] = false;
    // Call the recursive function starting from all vertices one by one
    for(int i = 0; i < V; i++)
        if(visited[i] = = false)
            BFSUtil(i,visited);
}

void BFSUtil(int s,bool *visited)
{
    queue<int> queue;
    visited[s]=true;
    queue.push(s);

    while(!queue.empty())
    {
        s = queue.front();
        queue.pop();
         // Get all adjacent vertices of the dequeued vertex s
        // If a adjacent has not been visited, then mark it visited
        // and enqueue it
        for(i = adj[s].begin(); i != adj[s].end(); ++i)
        {
            if(!visited[i])
            {                
                queue.push(i);
                BFSUtil(id,visited);
            }
        }
    }

}

如何有效地更改此代码以满足我的要求?

共有1个答案

帅煌
2023-03-14

你已经准备好了大部分想法,因为你正在存储这个访问的状态,并且#1已关闭。要执行#2,只需在已访问的列表中迭代,查找值false,以指示未访问的节点。现在在那个上面运行#1。重复上述操作,直到您发现已访问的中的所有条目均为真。

比如:

// Loop until all elements have been visited.
bool found = false;
do
{
    // Look for an element that hasn't been processed yet
    // to run the BFS.
    found = false;
    for(int i = 0; i < V; i++)
    {
        if(visited[i] = = false)
        {
            BFSUtil(i,visited);    
            found = true;
        }
    }
} while (found);

你也可以避免每次在#1之后通过访问进行线性搜索,使用一个比线性搜索更有效的集合,但所需的努力可能不值得,除非你搜索的是一大堆小的、不连续的图,这通常会降低遍历的性能,除非它是一个真正有效的集合(或密集稀疏的集合:一个用于常数时间快速检查,另一个用于日志或更好的时间插入)。

 类似资料:
  • 本文向大家介绍Python程序,用于在图形中使用BFS查找可从节点到达的所有节点,包括了Python程序,用于在图形中使用BFS查找可从节点到达的所有节点的使用技巧和注意事项,需要的朋友参考一下 当需要查找树的所有节点的总和时,将创建一个类,该类包含设置根节点,向树中添加元素,搜索特定元素以及将树中的元素添加至的方法。找到总和,依此类推。可以创建该类的实例来访问和使用这些方法。 以下是相同的演示-

  • 我试图解决一个问题,其中有一个带正加权边的无向图,我需要找到一个最短的路径,该路径正好覆盖所有节点,一旦给定了起始节点和结束节点。此外,图是完整的(每个节点都连接到图中的所有其他节点)。我已经试着寻找一个算法可以解决这个问题,但我还没有找到一个解决这个问题。由于起止节点的限制,这并不完全是旅游销售员的问题。我将感谢任何帮助。

  • 我使用Neo4j(版本3.4.1)和Spring-data-neo4j(5.0.10)。RELEASE)在我的应用程序中。我也在使用OGM。 我的节点之间有以下关系: 车辆(V)具有部件(P1和P2)。零件可从经销商处购买(D1、D2和D3)。零件本身可以相互链接(例如P2与P1链接) 我正在尝试编写一个密码查询,以获取与id匹配的零件节点。我希望获取该节点及其相关节点和关系。 下面是我的查询:

  • 我正在考虑以下问题(非常粗略的描述): 假设我们有一个图,其中边被分配了一些非负成本,一个起始节点和一些成本常数。找出: 一组节点,可从到达,其中从起始节点到中任何节点的最短路径成本不大于 对于集合中的每个,上面是最短路径的成本 基本上是有成本限制的Dijkstra。 我的主要问题是:图论中关于这个问题的正确术语是什么? 我一直在看“可访问性”或“可达性”,但这些似乎是错误的关键词。 最终,我正在

  • 我有一棵看起来像上面的树,由一个链接结构表示: 我的目标是找到从根节点到叶节点的所有路径。 我的树遍历算法如下所示: 当我运行它时,我确信树正在按图所示构建。我已经测试过了。然而,我无法找出我的树遍历分割错误的原因。 我得到的输出是: 我已经在高度较小的树上测试了它,它是有效的。但是出于某种原因,它不适用于高度大于2的树。我认为这是树出了问题,我检查并打印了每个父级、左子级和右子级,它们打印出来如

  • 我正在尝试将所有超文本标记语言节点转换为XPATH这是一个示例输入。基于超文本标记语言,我正在寻找所有子节点的所有XPATH 我想要的输出 我目前拥有的 代码 如果你们能给我指出正确的方向,任何帮助都会很好 我确实研究了Lxml bs4和硒,但不幸的是没有运气