圖的鏈式前向星存儲結構


一般來講,圖的常用存儲結構有鄰接矩陣,和鄰接表,但我們知道鄰接矩陣空間浪費太嚴重,鄰接表不好寫,今天來講一下圖的另一只常用的存儲結構:前向星和鏈式前向星,介於上述兩種存儲結構之間的一種比較均衡的存儲結構。

 

首先我們來說一下圖的前向星表示方法:

前向星是一種通過存儲邊信息的方式來存儲圖的一種數據結構,他構造簡單,讀入每條邊的信息,將邊存放在數組中,把數組中的邊按照起點順序排列,前向星也就構造完成了。方便查詢,我們用另外一個數組head(i)來存儲起點為vi的第一條邊的位置。

存儲結構:

[cpp]  view plain  copy
  1. int head[MAXN];  
  2. struct Node  
  3. {  
  4.     int from;//起點  
  5.     int to;//終點  
  6.     int w;//權值  
  7. };  
  8. Node map[MAXN];  


比較函數:

[cpp]  view plain  copy
  1. bool cmp(const Node &a,const Node &b)  
  2. {  
  3.     if(a.from==b.from)  
  4.     {  
  5.         if(a.to==b.to) return a.w<b.w;  
  6.         else return a.to<b.to;  
  7.     }  
  8.     else return a.from<b.from;  
  9. }  


讀入數據:

[cpp]  view plain  copy
  1. cin>>n>>m;  
  2. for(i=1;i<=m;i++)  
  3.   cin>>map[i].from>>map[i].to>>map[i].w;  
  4. sort(map+1,map+m+1,cmp);  
  5. memset(head,-1,sizeof(head));  
  6. for(i=1;i<=m;i++)  
  7.   if(map[i].from!=map[i-1].from)  
  8.     head[map[i].from]=i;  


遍歷函數:

[cpp]  view plain  copy
  1. for(i=1;i<=n;i++)  
  2.   for(j=head[i];map[j],from==i&&j<=m;j++)  
  3.     cout<<map[i].from<<map[i].to<<map[i].w<<endl;  


可以看出,前向星構造時間的復雜度主要取決於排序函數,一般來說,時間復雜度為O(m logm);空間上需要兩個數組,故空間復雜度為O(m+n);

前向星的有點在於可以對應點非常多的情況,可以存儲重復邊,但不能直接判斷圖中任意兩點是有邊。

 

鏈式前向星又稱為鄰接表的靜態建表方式,其最開始確實是基於前向星,是以提高前向星的構造效率為目的設計的存儲方式,最終演變成了一個變形的鄰接表這一數據結構。鏈式前向星采用數組模擬鏈表的方式實現鄰接表的功能(數組模擬鏈表的主要方式就是記錄下一個節點在數組的哪個位置。),並且使用很少的額外空間,可以說是目前建圖和遍歷效率最高的存儲方式了。

 

數據結構:

[cpp]  view plain  copy
  1. int head[MAXN];//表示以i為起點的第一條邊的存儲位置  
  2. struct Node  
  3. {  
  4.     int to;//第i條邊的終點  
  5.     int w;//第i條邊的權值  
  6.     int next;//與第i條邊同起點的下一條邊的存儲位置  
  7. };  
  8. Node map[MAXN];  


信息存儲代碼:

[cpp]  view plain  copy
  1. cin>>i>>j>>w;  
  2. map[k].to=j;  
  3. map[k].w=w;  
  4. map[k].next=head[i];  
  5. head[i]=k;  


遍歷代碼:

for(i=1;i<=n;i++)  
  for(j=head[i];j!=-1;j=map[j].next)  
    cout<<i<<map[j].to<<map[j].w<<endl;



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM