(一)鄰接表和鄰接矩陣算法
圖的存儲結構,有鄰接矩陣表示法和鄰接矩陣表示法兩種。數組
鄰接矩陣經過矩陣來存儲圖的信息,其算法的時間複雜度爲O(n^2);鄰接表經過鏈式存儲結構來存儲圖的信息,其算法的時間複雜度爲O(n+e);由於鄰接矩陣表示法不便於增長和刪除頂點,空間效率低,因此相對於鄰接表而言,鄰接矩陣更適合用於稠密圖,而稀疏圖更適合用於鄰接表。數據結構
採用鄰接矩陣表示法,建立無向網 Status CreateUDN(AMGraph &G) //G.vexnum:總頂點數;G.arcnum:總邊數;MaxInt:極大值 { cin>>G.vexnum>>G.arcnum; //輸入總頂點數,總邊數 for(i=0;i<G.vexnum;++i) cin>>G.vexs[i]; //依次輸入點的信息 for(i=0;i<G.vexnum;++i) for(j=0;j<G.vexnum;++j) G.arcs[i][j] = MaxInt; //初始化,權值都置爲極大值MaxInt for(k=0;k<G.arcnum;++k) { cin>>v1>>v2>>w; i=LocateVex(G,v1);j=LocateVex(G,v2); //肯定v1和v2在矩陣中的位置,既頂點數組的下標 G.arcs[i][j] = w; G.arcs[j][i] = G.arcs[i][j]; } return OK; }
圖的鄰接表存儲方式 #define MVNum 100 //最大頂點數 typedef struct ArcNode //邊結點 { int adjvex; //該邊所指向的頂點的位置 struct ArcNode *nextarc; //指向下一條邊的指針 OtherInfo info; //和邊相關的信息 } ArcNode; typedef struct VNode { VERtexType data; ArcNode *firstarc; }VNode,AdjList[MVNum]; typedef struct { ADjList vertics; int vexnum, arcnum; //圖當前頂點數和邊數 }SLGrapg;
(二)圖的遍歷spa
深度優先搜索(Depth First Search,DFS)遍歷相似於樹的先序遍歷,是樹先序遍歷的推廣。指針
廣度優先搜索(Breadth First Search,BFS)遍歷相似於樹的按層次遍歷的過程。code
(三)最小生成樹blog
圖G的生成樹是:包含G的所有頂點的極小連通子圖。最小生成樹的邊數=圖的頂點數-1。ci
最小生成樹的算法有普里姆算法和克魯斯卡爾算法兩種。class
普里姆算法:時間複雜度O(n^2),適用於稠密圖效率
克魯斯卡爾算法:時間複雜度O(Elog2e),適用於稀疏圖
(四)最短路徑的算法
算法的實現主要的難點在於須要引入輔助的數據結構。
(1)二維數組Path[i][j]:最短路徑上頂點vj的前一頂點的序號。
(2)二維數組D[i][j]:記錄頂點vi和vj之間的最短路徑長度。