import java.util.*;
/**寻找割点*/
public class FindArt {
static class Node
{
Node(String name)
{
this.name=name;
Childen=new ArrayList();
}
boolean visited;
int num;
int low;
String name;
Node parent;
List Childen;
public boolean equals(Node node)
{
if(this.name==node.name) return true;
return false;
}
}
public static void main(String args[])
{
Node A=new Node("A");
Node B=new Node("B");
Node C=new Node("C");
Node D=new Node("D");
Node E=new Node("E");
Node F=new Node("F");
Node G=new Node("G");
A.Childen.add(B);
A.Childen.add(D);
B.Childen.add(A);
B.Childen.add(C);
C.Childen.add(B);
C.Childen.add(D);
C.Childen.add(G);
D.Childen.add(A);
D.Childen.add(C);
D.Childen.add(E);
D.Childen.add(F);
E.Childen.add(D);
E.Childen.add(F);
F.Childen.add(D);
F.Childen.add(E);
G.Childen.add(C);
find(A);
count=1;
print(A);
}
private static int count=1;
private static List points=new ArrayList();
private static List mynode=new ArrayList();
public static void find(Node node)
{
List childs=node.Childen;
node.num=count++;
node.low=node.num;
node.visited=true;
for(Node n:childs)
{
if(!n.visited)
{
n.parent=node;
//前向遍历,给每个节点编号
find(n);
//判断是否是割点
if(n.low>=node.num&&node.num!=1)
{
points.add(node);
System.out.println(node.name+"是割点");
}
//后向遍历,计算low
node.low=Math.min(node.low,n.low);
}
else
{
//背向边中num
if(node.parent!=null&&!node.parent.equals(n))
node.low=Math.min(node.low,n.num);
}
}
}
public static void print(Node node)
{
mynode.add(node);
List childs=node.Childen;
System.out.println("name"+node.name+" num:"+node.num+" low:"+node.low);
for(Node n:childs)
{
if(!mynode.contains(n))
{
print(n);
}
}
}
}
5.执行结果
原图:
D是割点 C是割点 nameA num:1 low:1 nameB num:2 low:1 nameC num:3 low:1 nameD num:4 low:1 nameE num:5 low:4 nameF num:6 low:4 nameG num:7 low:7