图(c/c++)
簡介
圖是由頂點和邊組成的一種數據結構。n表示頂點數,e表示邊的個數。
a,圖按照邊有沒有方向可分為有向圖和無向圖兩種
b,完全圖:每對不同的頂點之間都恰連有一條邊相連。n個頂點的有向完全圖的邊的個數為nx(n-1),無向完全圖的邊的個數為(nx(n-1))/2。圖按照邊的數目多少可以分為稀疏圖和稠密圖
c,頂點的度:圖中某個頂點的度為該頂點所連接的邊的個數。有向圖中頂點的度按照指向該結點和由該結點出發可分為出度和入度。 有:圖中所有頂點的度數之和=2e
d,基本路徑:該路徑中沒有重復的頂點。簡單路徑:該路徑中沒有重復的邊。
簡單回路:由簡單路徑構成的回路
e,無向圖按照任意頂點是否存在路徑分為連通圖和非連通圖兩種,類似的,有向圖分為強連通圖和非強連通圖。無向圖:在非連通圖中極大連通子圖稱為連通分量,有向圖:在非強連通圖中的極大強連通子圖稱為強連通分量。
f,生成樹:一個連通圖的生成樹就是它的一個極小連通子圖。就是在滿足連通圖的前提下,去掉其中多余的邊,生成樹含有圖的所有n個頂點,但只含有構成一棵樹的n-1條邊(可以回憶下樹的性質:結點數=分支數+1)
圖的存儲結構
這里只介紹兩種:鄰接矩陣和鄰接表
鄰接矩陣
鄰接矩陣是一個nxn的二維數組,數組中標記了任意兩個頂點之間的連接情況,無向圖中該邊存在就標記為1,有向圖該邊存在就標記為對應權值;沒有邊存在標記為0;頂點自身的連接可標記為0或無窮大(一般選擇也標記為0)。如下:
typedef struct {int vexnum, arcnum;//頂點數和邊數char vex[maxSize];//頂點信息(字符)int arc[maxSize][maxSize];//二維數組(存儲邊上的信息) }mGraph;無向圖的鄰接矩陣是個對稱矩陣,且任一頂點的度是它所對應的行(列)中非零元素的個數。有向圖的是非對稱矩陣,頂點的出度為該頂點所對應行中非零元素個數,入度為對應列中非零元素的個數。
鄰接矩陣適合進行稠密圖的存儲。
鄰接表
是一種順序分配和鏈式分配相結合的存儲結構。將頂點存放在順序表vertices中,每個頂點所連接的邊(出度)通過鏈表來存放,即邊表結點arcNode。如下:
typedef struct arcNode {int adjvex;//與該邊所連頂點的序號double weight;//邊上的權值struct arcNode* nextArc; }arcNode;//邊表結點 typedef struct {char data;頂點中存儲的數據arcNode* firstArc; }adjList;//頂點 typedef struct{int vexnum, arcnum;adjList vertices[maxSize]; }aGraph;鄰接表適合存儲稀疏圖
總結
- 上一篇: 哈夫曼树(最优二叉树)(c/c++)
- 下一篇: DFS深度优先搜索算法/BFS广度优先搜