淺談鏈式前向星

功能:圖論中存儲點,邊和遍歷查找;

介紹:edge[i].w         第i條邊的權重

      edge[i].to        第i條邊的終點

      edge[i].next      與第i條邊同起點的上一條邊的存儲位置

      head[i]           以i爲起點的第一條邊的存儲位置


1. 添加點邊數據

#define maxn 10005
int head[maxn];
struct _edge_//定義結構體數組edge[]存儲邊的各項信息
{
    int w;
    int u,
    int v;
}edge[maxn];
int cnt=0;//cnt初始化爲0 
memset(head,-1,sizeof(head));//head[]初始化爲-1 
void add(int u,int v,int w)  //函數add可以添加數據
{
    edge[cnt].w=w;
    edge[cnt].to=v;
    edge[cnt].next=head[u];//上一條以u爲起點的邊的存儲位置 如果前面沒有以u爲起點的邊則使它等於-1
    head[u]=cnt++;//當前以u爲起點的邊的存儲位置
}

下面舉個例子 有助於理解 (爲了儘量好理解 我們省去權重這一項)


 邊信息    cnt     edge[cnt].to  edge[cnt].next    u     head[u]

(1,2)    0       2             -1                1     0

(2,3)    1       3             -1                2     1

(3,4)    2       4             -1                3     2

(1,3)    3       3              0                1     3

(4,1)    4       1             -1                4     4  

(1,5)    5       5              3                1     5 

(4,5)    6       5              4                4     6


2.遍歷以u爲起點的所有邊

int from=u;//起點爲u</span>
for(int i=head[u];i!=-1;i=edge[i].next)//先找到第一個以u爲起點的存儲位置 
{                                   //再令i爲上一條以u爲起點的存儲位置
    to=edge[i].to;                  //直到i==-1則之前沒有以u爲起點的邊
    w=edge[i].w;
}

現在讓我們開始查找以某個點爲起點的邊

借上例 我們來查找以1爲起點的邊

首先i=head[1]=5;得到最後一個以1爲起點的邊的存儲位置

然後我們就在edge[5]裏面找到這條邊所有的信息了

下面訪問edge[5].next  該值爲3  得到上一條以1爲起點的邊的存儲位置

同理我們可以在edge[3]中找到該邊所有的信息了

在接下來訪問edge[3].next 該值爲0 再得到更上面一條以1爲起點的邊的存儲位置

再同理我們可以在edge[0]中找到該邊所有的信息了

下面訪問edge[0].next==-1;結束


可能文字比較難於理解 下面來爲便於理解一發流程圖

u=1--->head[1]=5------>edge[5]------->edge[5].next=3----->edge[3]----->edge[3].next=0------->edge[0]

起點   第一個位置    邊的信息     上一條邊的存儲位置     邊的信息    再上一條邊的存儲位置    邊的信息

---->edge[0].next=-1

     結束

欲知更多相見ACdream的blog 附帶傳送門

http://blog.csdn.net/acdreamers/article/details/16902023

 

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