给出一个图 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 属性 = 特定颜色的主要内容,如果未能解决你的问题,请参考以下文章