java 数据结构 无向图_数据结构-无向图
1.圖的定義
圖(Graph)是由頂點(vertex)的有窮非空集合和頂點之間邊(edge)的集合組成,通常表示為:G(V,E),其中,G表示一個圖,V是圖G中頂點的集合,E是圖G中邊的集合 a.若頂點之間 Vi 和 Vj 之間沒有方向,則為無向邊,用無序偶對( Vi , Vj )表示 b.若頂點之間 Vi 和 Vj 之間有方向,則為有向邊(也稱弧),用有序偶對< Vi , Vj >表示, Vi 為弧尾,Vj為弧頭
2.圖的基本概念
(1)簡單圖? ? 圖中既無吊環又無多重邊,即為簡單圖 (2)無向圖? ?如果圖中任意兩個頂點之間的邊都是無向邊(簡而言之就是沒有方向的邊),則稱該圖為無向圖(Undirected graphs) (3)有向圖 如果圖中任意兩個頂點之間的邊都是有向邊(簡而言之就是有方向的邊),則稱該圖為有向圖(Directed graphs) (4)完全圖? ? ? ①無向完全圖:在無向圖中,如果任意兩個頂點之間都存在邊,則稱該圖為無向完全圖。(含有n個頂點的無向完全圖有(n×(n-1))/2條邊)
在無向圖中, 頂點的度—TD(v):指依附于該頂點的邊的個數,n個頂點e條邊的無向圖中有以下成立的公式: 權? ? 網 在圖中,權(weight)通常是對邊賦予的有意義的數值量,邊上帶權的圖稱為網或網圖(network)
3.圖的抽象數據類型定義
ADT Graph DATA 頂點的有窮非空集合和邊的集合 InitGraph 前置條件: 圖不存在 輸入:? ? ? ? 無 功能:? ? ? ? 圖的初始化 輸出:? ? ? ? 無 后置條件: 構造一個空的圖 DestoryGraph 前置條件: 圖已存在 輸入:? ? ? ? 無 功能:? ? ? ? 銷毀圖 輸出:? ? ? ? 無 后置條件: 釋放圖所占的存儲空間 GetVex 前置條件: 圖已存在 輸入:? ? ? ? 頂點V 功能:? ? ? ? 在圖中查找頂點V的數據信息 輸出:? ? ? ? 頂點V的數據信息 后置條件: 圖不變 putVex 前置條件: 圖已存在 輸入:? ? ? ? 頂點V,頂點信息value 功能:? ? ? ? 在圖中查找頂點V并將value的值賦給頂點V 輸出:? ? ? ? 無 后置條件: 無 InsertVex 前置條件: 圖已存在 輸入:? ? ? ? 頂點V 功能:? ? ? ? 在圖中插入一個頂點 輸出:? ? ? ? 如果插入不成功,拋出異常 后置條件:如果插入成功,圖中增加了一個頂點
deleteVex 前置條件: 圖已存在 輸入:? ? ? ? 頂點V 功能:? ? ? ? 在圖中刪除一個頂點 輸出:? ? ? ? 如果刪除不成功,拋出異常 后置條件:如果刪除成功,圖中少了一個頂點 insertArc 前置條件: 圖已存在 輸入:? ? ? ? 頂點U,頂點V,頂點U和V之間邊的信息 功能:? ? ? ? 在圖中插入一條邊 輸出:? ? ? ? 如果插入不成功,拋出異常 后置條件: 如果插入成功,圖中增加了一條邊 deleteArc 前置條件:? 圖已存在 輸入:? ? ? ? 頂點U,頂點V 功能:? ? ? ? 在圖中刪除頂點U和V之間的邊 輸出:? ? ? ? 如果刪除不成功,拋出異常 后置條件: 如果刪除成功,圖中少了一個頂點 DFSTraverse 前置條件: 圖已存在 輸入:? ? ? ? 遍歷的起始頂點V 功能:? ? ? ? 從頂點V出發深度優先遍歷圖 輸出:? ? ? ? 圖中頂點的一個線性排序 后置條件: 圖保持不變 BFSTraverse 前置條件: 圖已存在 輸入:? ? ? ? 遍歷的起始頂點V 功能:? ? ? ? 從頂點V出發廣度優先遍歷圖 輸出:? ? ? ? 圖中頂點的一個線性排序 后置條件: 圖保持不變
4.無向圖的遍歷
1問:以哪個頂點為起始頂點 1答:頂點都是平等的,可以選取任意一個頂點,可以按照編號小的開始 2問:圖中有回路(幾個頂點構成一個圓環),可能重復訪問,陷入死循環 2答:給頂點設置一個訪問標志,visited[n],n為圖中頂點的個數,未訪問標志0,如果頂點被訪問標志1深度優先遍歷: 基本思路: 1.訪問頂點V 2.從V的未被訪問的鄰接點中選取一個頂點W,從W出發進行深度優先遍歷 3.重復以上2步,直到圖中所有和V有路徑相通的頂點被訪問到偽代碼:(類似樹的前序遍歷) 1.訪問頂點,visited[v]=1; 2.w=頂點v的第一個鄰接點; 3.while(w){? ? ?if(w未被訪問) 從頂點w出發遞歸執行該算法? ? ?w=頂點v的下一個鄰接點 }廣度優先遍歷: 基本思路: 1.訪問頂點V 2.依次訪問V的各個未被訪問的鄰接點V1,V2,V3……VK 3.分別V1,V2,V3……VK從出發依次訪問他們未被訪問的鄰接點,并使“先被訪問頂點的鄰接點”先于“后被訪問頂點的鄰接點”被訪問,直到圖中所有與頂點V有路徑相通的頂點都被訪問到
偽代碼:(類似樹的層序遍歷) 1.初始化隊列Q 2.訪問頂點v,visited[v]=1,頂點入隊Q; 3.while(隊列Q非空){? ? ?v=隊列Q的隊頭元素出隊? ? ?w=頂點v的第一個鄰接點? ? ?while(w存在){? ? ? ? ?if(w未訪問){? ? ? ? ? ?訪問頂點w,visited[w]=1;頂點w入隊列Q? ? ? ? ?}? ? ? ? ?w=頂點v的下一個鄰接點? ? ?} }
總結
以上是生活随笔為你收集整理的java 数据结构 无向图_数据结构-无向图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css html span 块状不换行
- 下一篇: 2022-2028年中国共享住宿行业深度