鏈式前向星基本原理

一、概述

我們在學習圖論的時候學習了一種圖的存儲結構--二維數組鄰接矩陣儲存,他雖然可以表達直觀,快速訪問連接兩點的邊,但是它佔用空間大,只適用於點少的圖,所以我們需要一種能夠可以存儲大型圖的東西--鏈式前向星。

            前向星是一種特殊的邊集數組,我們把邊集數組中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點爲起點的所有邊在數組中的起始位置和存儲長度。

二、鏈式前向星基本原理

首先我們要存入以下一張圖:

點1指向點2、點3、點4。

  鏈式前向星是以邊爲主的存圖方式,我們需要利用結構體來規劃邊,這會使圖變得更加清晰。

  首先我們需要建立邊的數組edge[ ],一般我們需要它記錄多種元素:下一條邊的編號,這條邊到達的點,這條邊的長度 

struct Edge
{
	int next;//下一條邊的編號 
	int to;//這條邊到達的點 
	int dis;//這條邊的長度 
}edge[maxm];

其次我們將已知的邊加入; 

int main()
{
	num_edge=0;//定義邊數,後面直接++ 
	scanf("%d%d",&n,&m);//輸入點數和邊數
	for(int i=1;i<=m;i++)//記錄邊數 
	{
	scanf("%d%d%d",&u,&v,&d);//輸入從哪裏來到哪裏去權值是多少 
	add_edge(u,v,d);//正存圖 
	add_edge(v,u,d);//如果是無向圖,就要反存圖 
	}	

}

我們可以添加一個add函數方便我們添加:

void add_edge(int from,int to,int dis) //加入一條從from到to距離爲dis的單向邊 
{
	edge[++num_edge].next=head[from]; 
	edge[num_edge].to=to;//將to記錄 
	edge[num_edge].dis=dis;//將dis記錄 
	head[from]=num_edge;// 
}

可能過這一步有點迷,下面是一個存圖的模擬:

 

這邊模擬走完後,可以得到以下圖:

突發奇想,可能這樣比較形象: 

最後一部就是調用,它根據你的題目來決定。但都離不開以下程序核心:

for(int i=head[k];i!=0;i=edge[i].next)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章