圖的遍歷——DFS


原創


圖的遍歷有DFS和BFS兩種,現選用DFS遍歷圖。

存儲圖用鄰接矩陣,圖有v個頂點,e條邊,鄰接矩陣就是一個VxV的矩陣;

若頂點1和頂點5之間有連線,則矩陣元素[1,5]置1,若是無向圖[5,1]也

置1,兩頂點之間無連線則置無窮,頂點到頂點本身置0。

例如:

鄰接矩陣為:

遍歷思路:

  隨便選擇一未訪問過的頂點v1作為遍歷起點,訪問v1,再選擇與v1連接的點v2作為起始點,訪問v2;

再選擇與v2連接的點作為起始點v3,訪問v3,假設v3是孤立點,則v3不能往下訪問,回溯到v2,再以v2

作為起點,訪問與v2連接的其他未被訪問過的頂點,假設是v4,則再以v4為頂點,訪問v4,再選擇與v4

連接的頂點為起始點......直到全部頂點都被訪問過一遍。

  在上圖中,假設以頂點2為起點進行圖的遍歷,則先訪問頂點2,再訪問頂點1,注意,並不是先訪問

3,因為在掃描鄰接矩陣時,在每行是從左向右掃描的;再訪問頂點0,再深搜下去訪問頂點4,訪問頂點

5,一直回溯,回溯到頂點2,再訪問頂點3;訪問順序為:2 1 0 4 5 3 

Java:

import java.util.*;

public class 圖的遍歷_dfs {
    
    static int v;    //頂點數
    static int e;    //邊數
    static int arr[][];
    static int book[];    //標識頂點是否訪問
    static int max=99999;    //無窮
    static int total=0;    //統計已訪問頂點個數
    
    static void graph_dfs(int ver) {    //ver表示頂點
        total++;
        book[ver]=1;    //標記頂點ver已經訪問過
        System.out.print(ver+" ");
        if(total==v) {
            return;
        }
        for(int i=0;i<v;i++) {
            if(arr[ver][i]==1 && book[i]==0) {
                graph_dfs(i);
            }
        }
        return;
    }

    public static void main(String[] args) {
        Scanner reader=new Scanner(System.in);
        v=reader.nextInt();
        e=reader.nextInt();
        arr=new int[v][v];
        book=new int[v];
        //鄰接矩陣初始化
        for(int i=0;i<v;i++) {
            book[i]=0;
            for(int j=0;j<v;j++) {
                if(i==j) {
                    arr[i][j]=0;
                }
                else {
                    arr[i][j]=max;
                }
            }
        }
        //讀入邊
        for(int i=0;i<e;i++) {
            int first_E=reader.nextInt();
            int second_E=reader.nextInt();
            arr[first_E][second_E]=1;
            arr[second_E][first_E]=1;
        }
        graph_dfs(0);    //從頂點0開始遍歷
    }

}

18:08:52

2018-07-22


免責聲明!

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



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