求無向連通圖的最小割點詳解以及java原始碼實現
阿新 • • 發佈:2019-02-02
import java.util.*; /**尋找割點*/ public class FindArt { static class Node { Node(String name) { this.name=name; Childen=new ArrayList<Node>(); } boolean visited; int num; int low; String name; Node parent; List<Node> 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<Node> points=new ArrayList<Node>(); private static List<Node> mynode=new ArrayList<Node>(); public static void find(Node node) { List<Node> 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<Node> 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