Graph 无向图中关键节点的数目
我有一个包含N个节点和E条边的图G。每条边都是无向的。目标是找到关键节点的数量 当移除图时,使其断开连接的节点称为关键节点。 目标是在图中找到此类节点的数量 解决办法是:- 对于属于图形的每个节点, 将其从图表中删除, 从剩余的图形中选择一个节点, 执行dfs, 如果我们能够到达任何地方,那么它就不是一个关键节点 这个解是O(N*E)或最坏情况O(N^3)Graph 无向图中关键节点的数目,graph,depth-first-search,Graph,Depth First Search,我有一个包含N个节点和E条边的图G。每条边都是无向的。目标是找到关键节点的数量 当移除图时,使其断开连接的节点称为关键节点。 目标是在图中找到此类节点的数量 解决办法是:- 对于属于图形的每个节点, 将其从图表中删除, 从剩余的图形中选择一个节点, 执行dfs, 如果我们能够到达任何地方,那么它就不是一个关键节点 这个解是O(N*E)或最坏情况O(N^3) 是否存在O(N^2)解或O(E)解,因为N^3有点太慢。关键节点是一个节点,当删除该节点时,会将图切割为两个或多个不相交的子图 因此,关键节
是否存在O(N^2)解或O(E)解,因为N^3有点太慢。关键节点是一个节点,当删除该节点时,会将图切割为两个或多个不相交的子图 因此,关键节点是连接到仅通过该关键节点连接的2个或多个子图的节点 可能的解决方案如下:
- 对于图G中的每个节点i:
- 列表L:直接连接到节点i的所有节点
- 如果列表L中存在2个节点u和v,这样就没有通过v连接u的路径,而不是通过i,那么i是一个关键节点
公共类十字节点
{
公共静态数组列表交叉(图g)
{
ArrayList=newArrayList();
for(Node n:g.getV())if(isCrucial(g,n))critical.add(n);
回归至关重要;
}
公共静态布尔isCrucial(图g,节点n)
{
图h=新图(g);
h、 移除顶点(n);
对于(节点u:n.getNext())
{
对于(节点v:n.getNext())
{
如果(u等于(v))继续;
如果(!h.connected(u,v))返回true;
}
}
返回false;
}
}
关键节点不需要有关键边缘。把这个图作为一个例子,两个方块中的共同顶点是一个重要的顶点,但它没有决定性的边缘。“关键节点”实际上更正式地被称为关节点,不知道我是如何知道的,但是一个简单的谷歌搜索会发现非常好的算法来找出关节点。
public class CrucialNode
{
public static ArrayList<Node> crucialVertices (Graph g)
{
ArrayList<Node> crucial = new ArrayList<Node> ();
for (Node n : g.getV()) if (isCrucial(g,n)) crucial.add(n);
return crucial;
}
public static boolean isCrucial (Graph g, Node n)
{
Graph h = new Graph(g);
h.removeVertex(n);
for (Node u : n.getNext())
{
for (Node v : n.getNext())
{
if (u.equals(v)) continue;
if (!h.connected(u,v)) return true;
}
}
return false;
}
}