1. 程式人生 > >求無向連通圖的最小割點詳解以及java原始碼實現

求無向連通圖的最小割點詳解以及java原始碼實現

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