圖的幾種存儲結構: 1,、鄰接矩陣 2,、鄰接表 3、鏈式前向星 4,、C++中vector的鄰接表實現(xiàn)(補充) (一)鄰接矩陣鄰接矩陣是表示頂點之間相鄰關系的矩陣,。鄰接矩陣的好處: (1)直觀、簡單,、好理解 (2)方便檢查任意一對定點間是否存在邊 (3)方便找任一頂點的所有“鄰接點”(有邊直接相連的頂點) (4)方便計算任一頂點的度 對于無向圖,,鄰接矩陣的第i行(或第i列)非零元素(或非∞元素)的個數(shù)正好是第i個頂點的度。 對于有向圖,,鄰接矩陣的第i行(或第i列)非零元素(或非∞元素)的個數(shù)正好是第i個頂點的出度(或入度)。 鄰接矩陣的局限性:時間復雜度O(n^2),,空間復雜度O(n^2) (1)浪費空間,。對于稠密圖還是很合算的。 但是對于稀疏圖(點很多而邊很少)有大量無效元素,。 (2)浪費時間,。要確定圖中有多少條邊,,則必須按行、按列對每個元素進行檢測,,所花費的時間代價很大,。 bb這么多,我們直接來以OJ此專題第一題為例 這題二維數(shù)組map不能用int,,會爆內存,,bool可以自己百度,簡而言之就是用于邏輯判斷,,只有true和false兩種情況,。 bool類型在存儲二值變量,或者說只有真假時,,更具優(yōu)勢,,因為只有0和1即false和true,省空間 (int型的0和1都是4字節(jié),,bool都是1字節(jié))
(二)鄰接表圖的鄰接表存儲方法是一種順序分配與鏈式分配相結合的存儲方法,。在鄰接表中,對圖中每個頂點建立一個單鏈表,,第i個單鏈表中的節(jié)點表示依附于頂點i的邊(對有向圖是以頂點i為尾的邊),。每個單鏈表上附設一個表頭節(jié)點。 鄰接表的特點如下: (1)鄰接表表示不唯一,。這是因為在每個頂點對應的單鏈表中,,各邊節(jié)點的鏈接次序可以是任意的,取決于建立鄰接表的算法以及邊的輸入次序,。 (2)對于有n個頂點和e條邊的無向圖,,其鄰接表有n個頂點節(jié)點和2e個邊節(jié)點。顯然,,在總的邊數(shù)小于n(n-1)/2的情況下,,鄰接表比鄰接矩陣要節(jié)省空間。 (3)對于無向圖,,鄰接表的頂點i對應的第i個鏈表的邊節(jié)點數(shù)目正好是頂點i的度,。 (4)對于有向圖,鄰接表的頂點i對應的第i個鏈表的邊節(jié)點數(shù)目僅僅是頂點i的出度,。其入度為鄰接表中所有adjvex域值為i的邊節(jié)點數(shù)目,。
(三)鏈式前向星https://blog.csdn.net/Binary_Heap/article/details/78209086 1. 結構這里用兩個東西: 1 結構體數(shù)組edge存邊,edge[i]表示第i條邊, 2 head[i]存以i為起點的第一條邊(在edge中的下標)
2.增邊若以點u為起點的邊新增了一條,,在edge中的下標為cnt. 那么edge[++cnt].next=head[u];然后head[u]=cnt. 即每次新加的邊作為第一條邊,,最后倒序遍歷
3. 遍歷遍歷以st為起點的邊
i 開始為第一條邊,每次指向下一條(以0為結束標志) (若下標從0開始,,next應初始化-1) 鏈式前向星主要是用來優(yōu)化的,,可以用來優(yōu)化BFS,SPFA算法等等,。在做最短路的時候一直T就是因為沒有用鏈式前向星存邊導致的超時,,所以這個坑我先和你們說下。 (四)vector的鄰接表(補充)vector是C++STL里面的一個東西,,簡單的來說就是一個可變長的數(shù)組,,你可以通過往它里面壓入數(shù)據(jù)來使它變長, 想深入了解的可以自己百度一波,,還是以這道題為例:
嗯,,目前我用過的圖的幾種存儲方式就這樣啦,謝謝大家觀賞拙作,。 |
|