给出一个图 G 找到该图中的所有节点块,使得 node.color 属性 = 特定颜色

Posted

技术标签:

【中文标题】给出一个图 G 找到该图中的所有节点块,使得 node.color 属性 = 特定颜色【英文标题】:Give a graph G find all the blob of nodes in this graph such that node.color attribute = specific color 【发布时间】:2019-12-05 00:19:57 【问题描述】:

给定一个图,假设连接,编写一个 C++ 函数,在该图中查找并返回满足特定条件的节点的连接 blob,例如node.color=green。

【问题讨论】:

您好,欢迎来到 ***,请阅读How to Ask。 到目前为止你尝试过什么?你在哪里卡住了?请向我们展示您的一些代码。 我不知道从哪里开始。我是否遍历图表并收集所有颜色 = 绿色的节点。然后尝试在该组节点中找到最大的连通图? 【参考方案1】:

您可以实现的最简单的方法是遍历图形并检查每个节点的颜色。

在 C++ 伪代码中:

for (auto & node : graph.nodes) 
  if (node.visited) continue;
  node.visited = true;
  if (node.color != "green") continue;
  size_t count = 1;

  // Assuming node.neighbours contains Node* elements. Do a DFS from this node.
  std::stack<Node*> todo(node.neighbours.begin(), node.neighbours.end());
  while (!todo.empty()) 
    auto n = todo.top(); todo.pop();
    if (n->visited) return;
    n->visited = true;

    if (n->color == "green") 
      // Further explore all neighbours.
      count++;
      for (auto n2 : n->neighbours) 
        todo.push(n2);
       
    
  
  cout << "node " << node.id << " has " << count << " neighbours" << endl;

修改此代码以将其聚合为“连接节点的 blob”并返回最大的此类 blob 作为练习。

或者,您可以定期遍历所有节点并使用union-find,修改为跟踪集合大小。当您遍历它们时,每个绿色节点本身就成为一个集合,如果它们不属于任何集合(如果未访问)或不同的集合(如果已访问),则将其与其绿色邻居连接。最大的连接 blob 就是最大的联合。

【讨论】:

以上是关于给出一个图 G 找到该图中的所有节点块,使得 node.color 属性 = 特定颜色的主要内容,如果未能解决你的问题,请参考以下文章

在图中,如何找到一组节点最近的节点?

CF567E President and Roads

强连通分量

图论篇6——割点(关节点)

Leetcode No.133 克隆图(DFS)

Leetcode No.133 克隆图(DFS)