無向圖的深度優先搜索和廣度優先搜索


 圖的定義:由一組頂點和一組能夠將兩個頂點相連的邊組成的數據結構.

 

圖的常用表示方法

 

鄰接矩陣:使用矩陣表示,當頂點v和w連接在一起時,就把v行w列定義為true,否則為false,但大量數據時所需空間不能滿足.

 

邊的數組:使用一個Edge類,含有兩個變量,對應邊上的頂點.

 

鄰接表數組:以頂點為索引的列表數組,數組中的每個元素都是和該頂點鄰接的頂點.

 

連通圖:從任意一個頂點都存在一條路徑到達另一個任意頂點,如果一個非連通圖由若干連通的部分組成,它們都是極大連通子圖.

 

圖的密度是指已經連接的頂點對所占所有可能連接的頂點對的比例.在稀疏圖中,被連接的頂點對很少,而在稠密圖中,只有少部分頂點對之間沒有邊連接.

 

二分圖是一種能夠將所有節點分為兩部分的圖,其中圖的每條邊所連接的兩個頂點都分別屬於不同的部分.

 

 

 

利用深度優先搜索尋找路徑

 

public class DepthFirstPaths {

    private boolean[] marked;    //是否調用過dfs
    private int[] edgeTo;        //從起點到一個頂點已知路徑上的最后一個頂點
    private final int s;        //起點
    
    public DepthFirstPaths(Graph G,int s){
        marked = new boolean[G.V()];
        edgeTo = new int[G.V()];
        this.s = s;
        dfs(G,s);
    }
    
    public void dfs(Graph G, int v){
        marked[v] = true;    //標記為已調用
        for(int w:G.adj(v)){    //遍歷該頂點所有鄰接點
            if(!marked[w]){
                edgeTo[w] = v;    //最后到達w的頂點
                dfs(G,w);
            }
        }
    }
    
    public boolean hasPathTo(int v){
        return marked[v];
    }
    
    //遍歷從出發點s到頂點v的路徑
    public Iterable<Integer> pathTo(int v){
        if(!hasPathTo(v)) return null;
        Stack<Integer> path = new Stack<Integer>();
        for(int x = v; x != s; x=edgeTo[x]){
            path.push(x);
        }
        path.push(s);
        return path;
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
    }

}
View Code

 

 

利用廣度優先搜索尋找路徑

 

public class BreadthFirstPaths {

    private boolean[] marked;
    private int[] edgeTo;
    private final int s;
    
    public BreadthFirstPaths(Graph G, int s){
        marked = new boolean[G.V()];
        edgeTo = new int[G.V()];
        this.s = s;
        bfs(G,s);
    }
    
    private void bfs(Graph G,int s){
        Queue<Integer> queue = new Queue<Integer>();
        marked[s] = true;
        //起點存入隊列
        queue.enqueue(s);
        while(!queue.isEmpty()){
            //刪除頂點
            int v = queue.dequeue();
            for(int w:G.adj(v)){
                if(!marked[w]){
                    edgeTo[w] = v;
                    marked[w] = true;
                    queue.enqueue(w);                    
                }
            }
        }
    }
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM