日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

链式前向星(转)

發(fā)布時間:2023/12/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链式前向星(转) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)自大佬博客https://blog.csdn.net/ACdreamers/article/details/16902023

我們首先來看一下什么是前向星.

?

前向星是一種特殊的邊集數(shù)組,我們把邊集數(shù)組中的每一條邊按照起點(diǎn)從小到大排序,如果起點(diǎn)相同就按照終點(diǎn)從小到大排序,

并記錄下以某個點(diǎn)為起點(diǎn)的所有邊在數(shù)組中的起始位置和存儲長度,那么前向星就構(gòu)造好了.

?

用len[i]來記錄所有以i為起點(diǎn)的邊在數(shù)組中的存儲長度.

用head[i]記錄以i為邊集在數(shù)組中的第一個存儲位置.

?

那么對于下圖:

?

?

?

我們輸入邊的順序?yàn)?

?

1 2

2 3

3 4

1 3

4 1

1 5

4 5

?

那么排完序后就得到:

?

編號: ? ? 1 ? ? ?2 ? ? ?3 ? ? ?4 ? ? ?5 ? ? ?6 ? ? ?7

起點(diǎn)u: ? ?1 ? ? ?1 ? ? ?1 ? ? ?2 ? ? ?3 ? ? ?4 ? ? ?4

終點(diǎn)v: ? ?2 ? ? ?3 ? ? ?5 ? ? ?3 ? ? ?4 ? ? ?1 ? ? ?5

?

得到:

?

head[1] = 1 ? ?len[1] = 3

head[2] = 4 ? ?len[2] = 1

head[3] = 5 ? ?len[3] = 1

head[4] = 6 ? ?len[4] = 2

?

但是利用前向星會有排序操作,如果用快排時間至少為O(nlog(n))

?

?

如果用鏈?zhǔn)角跋蛐?就可以避免排序.

?

我們建立邊結(jié)構(gòu)體為:

?

struct Edge

{

? ? ?int next;

? ? ?int to;

? ? ?int w;

};

?

其中edge[i].to表示第i條邊的終點(diǎn),edge[i].next表示與第i條邊同起點(diǎn)的下一條邊的存儲位置,edge[i].w為邊權(quán)值.

?

另外還有一個數(shù)組head[],它是用來表示以i為起點(diǎn)的第一條邊存儲的位置,實(shí)際上你會發(fā)現(xiàn)這里的第一條邊存儲的位置其實(shí)

在以i為起點(diǎn)的所有邊的最后輸入的那個編號.

?

head[]數(shù)組一般初始化為-1,對于加邊的add函數(shù)是這樣的:

1 void add(int u,int v,int w) 2 { 3 edge[cnt].w = w; 4 edge[cnt].to = v; 5 edge[cnt].next = head[u]; 6 head[u] = cnt++; 7 } 8

初始化cnt = 0,這樣,現(xiàn)在我們還是按照上面的圖和輸入來模擬一下:

?

?

edge[0].to = 2; ? ? edge[0].next = -1; ? ? ?head[1] = 0;

edge[1].to = 3; ? ? edge[1].next = -1; ? ? ?head[2] = 1;

edge[2].to = 4; ? ? edge[2],next = -1; ? ? ?head[3] = 2;

edge[3].to = 3; ? ? edge[3].next = 0; ? ? ? head[1] = 3;

edge[4].to = 1; ? ? edge[4].next = -1; ? ? ?head[4] = 4;

edge[5].to = 5; ? ? edge[5].next = 3; ? ? ? head[1] = 5;

edge[6].to = 5; ? ? edge[6].next = 4; ? ? ? head[4] = 6;

?

很明顯,head[i]保存的是以i為起點(diǎn)的所有邊中編號最大的那個,而把這個當(dāng)作頂點(diǎn)i的第一條起始邊的位置.

?

這樣在遍歷時是倒著遍歷的,也就是說與輸入順序是相反的,不過這樣不影響結(jié)果的正確性.

比如以上圖為例,以節(jié)點(diǎn)1為起點(diǎn)的邊有3條,它們的編號分別是0,3,5 ? 而head[1] = 5

?

我們在遍歷以u節(jié)點(diǎn)為起始位置的所有邊的時候是這樣的:

?

for(int i=head[u];~i;i=edge[i].next)

?

那么就是說先遍歷編號為5的邊,也就是head[1],然后就是edge[5].next,也就是編號3的邊,然后繼續(xù)edge[3].next,也

就是編號0的邊,可以看出是逆序的.

?

轉(zhuǎn)載于:https://www.cnblogs.com/moomcake/p/9879142.html

總結(jié)

以上是生活随笔為你收集整理的链式前向星(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。