圖(graph)

圖可以分為以下三種:

image.png

無向圖: 就行朋友關系一樣,你是我們的朋友,那么我也就是你的朋友;
有向圖:有向圖就像粉絲和偶像的關系,你是我的粉絲,我不一定是你的粉絲;
帶權圖:就像地鐵站各個站點之間的關系,不僅僅是相互連接,站與站之間還有距離的差距。帶權圖又可以分為無向帶權圖和有向帶權圖。

圖中的各個概念

圖中的元素我們稱之為頂點(vertex);頂點之間的連寫稱之為;對于無向圖來說,頂點連接的邊的個數(shù)稱之為;對于有向圖來說,指向頂點的邊數(shù)稱為入度;從頂點出來的邊數(shù)稱為出度

圖的表示方法

圖有兩種表示方式:
鄰接矩陣法:用矩陣來存儲,如下圖所示,優(yōu)點就是定位簡單,因為數(shù)組支持直接下標索引;缺點就是浪費空間,對于無向圖有一半是沒用的,對于稀疏圖,好多空間閑置。

image.png

鄰接表法:鄰接表法如下,每個頂點所連接的頂點用鏈表連接起來。

image.png

圖的最短路徑查找

廣度優(yōu)先(BFS)搜索算法:顧名思義就是層層推進的搜索方式,先搜索離起點最近的頂點,然后依次往后搜索;因為是從近往遠搜索,所以最先找到的肯定是距離最近的

image.png

public void bfs(int start, int end){
        if(start == end) return;
        boolean[] visited = new boolean[v];
        visited[start] = true;
        int[] prev = new int[v];
        for(int i = 0; i < v; i++){
            prev[i] = -1;
        }
        Queue<Integer> queue = new LinkedList<Integer>();
        queue.add(start);
        while(!queue.isEmpty()){
            int current = queue.poll();
            for(int i = 0; i < adj[current].size(); i++){
                int next = adj[current].get(i);
                if(visited[next] == true){
                    continue;
                }
                prev[next] = current;
                visited[next] = true;
                if(next == end){
                    print(prev, start, end);
                    return;
                }
                queue.offer(next);
            }
        }
    }

深度優(yōu)先算法(DFS) 顧名思義就是一條分支走到底,遍歷完之后再向上回溯走下一個分支。
java代碼實現(xiàn)如下

public void dfs(int start, int end){
        if(start == end) return;
        boolean[] visited = new boolean[v];
        int[] prev = new int[v];
        for(int i = 0; i < v; i++){
            prev[i] = -1;
        }
        Stack<Integer> stack = new Stack<Integer>();
        visited[start] = true;
        stack.push(start);
        while(!stack.empty()){
            int current = stack.pop();
            for(int i = 0; i < adj[current].size(); i++){
                if(visited[adj[current].get(i)] == true){
                    continue;
                }
                visited[adj[current].get(i)] = true;
                prev[adj[current].get(i)] = current;

                if(adj[current].get(i) == end){
                    print(prev, start, end);
                    return;
                }
                stack.push(adj[current].get(i));
            }
        }
    }
    private void print(int[] prev, int start, int end) {
        int last = prev[end];
        if(last != -1 && end != start){
            print(prev, start, last);
        }
        System.out.print(" " + end);
    }
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 線性表是一對一,樹是一對多,圖是多對多的關系。 圖中的數(shù)據(jù)元素我們稱為頂點(相對于樹中的結(jié)點),頂點集合不能為空,...
    XDgbh閱讀 13,188評論 0 0
  • 圖看起來就像下圖這樣: 在計算機科學中,一個圖就是一些頂點的集合,這些頂點通過一系列邊結(jié)對(連接)。頂點用圓圈表示...
    唐先僧閱讀 147,558評論 12 96
  • 基本概念 數(shù)據(jù)元素之間是一種多對多的關系,用羅輯邊標識元素之間的關系; 線性表中數(shù)據(jù)稱為 元素,樹中將元素稱為 結(jié)...
    liangxifeng833閱讀 1,181評論 0 2
  • 圖是一種比線性表和樹更復雜的數(shù)據(jù)結(jié)構,在圖中,結(jié)點之間的關系是任意的,任意兩個數(shù)據(jù)元素之間都可能相關。圖是一種多對...
    Alent閱讀 2,424評論 1 22
  • 我不過也是常人,有常人經(jīng)常都會普遍的事情和情況。 這就是生活,我也沒有辦法我有情緒和失控。有憤怒有不滿有沖突,有憎惡。
    吉祥微創(chuàng)閱讀 211評論 0 0

友情鏈接更多精彩內(nèi)容