国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

【坐在馬桶上看算法】算法8:巧妙的鄰接表(數(shù)組實(shí)現(xiàn))

開發(fā) 后端 前端 算法
細(xì)心的同學(xué)會(huì)發(fā)現(xiàn),此時(shí)遍歷邊某個(gè)頂點(diǎn)邊的時(shí)候的遍歷順序正好與讀入時(shí)候的順序相反。因?yàn)樵跒槊總€(gè)頂點(diǎn)插入邊的時(shí)候都直接插入“鏈表”的首部而不是尾部。不過這并不會(huì)產(chǎn)生任何問題,這正是這種方法的其妙之處。

之前我們介紹過圖的鄰接矩陣存儲(chǔ)法,它的空間和時(shí)間復(fù)雜度都是N2,現(xiàn)在我來介紹另外一種存儲(chǔ)圖的方法:鄰接表,這樣空間和時(shí)間復(fù)雜度就都是M。對(duì)于稀疏圖來說,M要遠(yuǎn)遠(yuǎn)小于N2。先上數(shù)據(jù),如下

  1. 4 5   
  2. 1 4 9   
  3. 4 3 8   
  4. 1 2 5   
  5. 2 4 6   
  6. 1 3 7 

091650e0f00oqrcjcfnq93.png

***行兩個(gè)整數(shù)n m。n表示頂點(diǎn)個(gè)數(shù)(頂點(diǎn)編號(hào)為1~n),m表示邊的條數(shù)。接下來m行表示,每行有3個(gè)數(shù)x y z,表示頂點(diǎn)x到頂點(diǎn)y的邊的權(quán)值為z。下圖就是一種使用鏈表來實(shí)現(xiàn)鄰接表的方法。

091650gyll6hbqbjyxls8s.png

上面這種實(shí)現(xiàn)方法為圖中的每一個(gè)頂點(diǎn)(左邊部分)都建立了一個(gè)單鏈表(右邊部分)。這樣我們就可以通過遍歷每個(gè)頂點(diǎn)的鏈表,從而得到該頂點(diǎn)所有的邊了。使用鏈表來實(shí)現(xiàn)鄰接表對(duì)于痛恨指針的的朋友來說,這簡(jiǎn)直就是噩夢(mèng)。這里我將為大家介紹另一種使用數(shù)組來實(shí)現(xiàn)的鄰接表,這是一種在實(shí)際應(yīng)用中非常容易實(shí)現(xiàn)的方法。這種方法為每個(gè)頂點(diǎn)i(i從1~n)也都保存了一個(gè)類似“鏈表”的東西,里面保存的是從頂點(diǎn)i出發(fā)的所有的邊,具體如下。

首先我們按照讀入的順序?yàn)槊恳粭l邊進(jìn)行編號(hào)(1~m)。比如***條邊“1 4 9”的編號(hào)就是1,“1 3 7”這條邊的編號(hào)是5。

這里用u、v和w三個(gè)數(shù)組用來記錄每條邊的具體信息,即u[i]、v[i]和w[i]表示第i條邊是從第u[i]號(hào)頂點(diǎn)到v[i]號(hào)頂點(diǎn)(u[i]àv[i]),且權(quán)值為w[i]。

091650h35zq3wgx30x3oe3.png

再用一個(gè)first數(shù)組來存儲(chǔ)每個(gè)頂點(diǎn)其中一條邊的編號(hào)。以便待會(huì)我們來枚舉每個(gè)頂點(diǎn)所有的邊(你可能會(huì)問:存儲(chǔ)其中一條邊的編號(hào)就可以了?不可能吧,每個(gè)頂點(diǎn)都需要存儲(chǔ)其所有邊的編號(hào)才行吧!甭著急,繼續(xù)往下看)。比如1號(hào)頂點(diǎn)有一條邊是 “1 4 9”(該條邊的編號(hào)是1),那么就將first[1]的值設(shè)為1。如果某個(gè)頂點(diǎn)i沒有以該頂點(diǎn)為起始點(diǎn)的邊,則將first[i]的值設(shè)為-1。現(xiàn)在我們來看看具體如何操作,初始狀態(tài)如下。

091650zw3988qpj5iljj8g.png

咦?上圖中怎么多了一個(gè)next數(shù)組,有什么作用呢?不著急,待會(huì)再解釋,現(xiàn)在先讀入***條邊“1 4 9”。

讀入第1條邊(1 4 9),將這條邊的信息存儲(chǔ)到u[1]、v[1]和w[1]中。同時(shí)為這條邊賦予一個(gè)編號(hào),因?yàn)檫@條邊是***讀入的,存儲(chǔ)在u、v和w數(shù)組下標(biāo)為1的單元格中,因此編號(hào)就是1。這條邊的起始點(diǎn)是1號(hào)頂點(diǎn),因此將first[1]的值設(shè)為1。

另外這條“編號(hào)為1的邊”是以1號(hào)頂點(diǎn)(即u[1])為起始點(diǎn)的***條邊,所以要將next[1]的值設(shè)為-1。也就是說,如果當(dāng)前這條“編號(hào)為i的邊”,是我們發(fā)現(xiàn)的以u(píng)[i]為起始點(diǎn)的***條邊,就將next[i]的值設(shè)為-1(貌似的這個(gè)next數(shù)組很神秘啊⊙_⊙)。

091651kwo5g0aycy07wfwd.png

讀入第2條邊(4 3 8),將這條邊的信息存儲(chǔ)到u[2]、v[2]和w[2]中,這條邊的編號(hào)為2。這條邊的起始頂點(diǎn)是4號(hào)頂點(diǎn),因此將first[4]的值設(shè)為2。另外這條“編號(hào)為2的邊”是我們發(fā)現(xiàn)以4號(hào)頂點(diǎn)為起始點(diǎn)的***條邊,所以將next[2]的值設(shè)為-1。

091651fkswcj34c05k8w4k.png

讀入第3條邊(1 2 5),將這條邊的信息存儲(chǔ)到u[3]、v[3]和w[3]中,這條邊的編號(hào)為3,起始頂點(diǎn)是1號(hào)頂點(diǎn)。我們發(fā)現(xiàn)1號(hào)頂點(diǎn)已經(jīng)有一條“編號(hào)為1 的邊”了,如果此時(shí)將first[1]的值設(shè)為3,那“編號(hào)為1的邊”豈不是就丟失了?我有辦法,此時(shí)只需將next[3]的值設(shè)為1即可。現(xiàn)在你知道next數(shù)組是用來做什么的吧。next[i]存儲(chǔ)的是“編號(hào)為i的邊”的“前一條邊”的編號(hào)。

091651df28foy9ct7fl7qf.png

讀入第4條邊(2 4 6),將這條邊的信息存儲(chǔ)到u[4]、v[4]和w[4]中,這條邊的編號(hào)為4,起始頂點(diǎn)是2號(hào)頂點(diǎn),因此將first[2]的值設(shè)為4。另外這條“編號(hào)為4的邊”是我們發(fā)現(xiàn)以2號(hào)頂點(diǎn)為起始點(diǎn)的***條邊,所以將next[4]的值設(shè)為-1。

091652vf4eg69f5zfsese9.png

讀入第5條邊(1 3 7),將這條邊的信息存儲(chǔ)到u[5]、v[5]和w[5]中,這條邊的編號(hào)為5,起始頂點(diǎn)又是1號(hào)頂點(diǎn)。此時(shí)需要將first[1]的值設(shè)為5,并將next[5]的值改為3。

091652li6mzammza242tmp.png

此時(shí),如果我們想遍歷1號(hào)頂點(diǎn)的每一條邊就很簡(jiǎn)單了。1號(hào)頂點(diǎn)的其中一條邊的編號(hào)存儲(chǔ)在first[1]中。其余的邊則可以通過next數(shù)組尋找到。請(qǐng)看下圖。

091652rtjh5qe2211eee58.png

細(xì)心的同學(xué)會(huì)發(fā)現(xiàn),此時(shí)遍歷邊某個(gè)頂點(diǎn)邊的時(shí)候的遍歷順序正好與讀入時(shí)候的順序相反。因?yàn)樵跒槊總€(gè)頂點(diǎn)插入邊的時(shí)候都直接插入“鏈表”的首部而不是尾部。不過這并不會(huì)產(chǎn)生任何問題,這正是這種方法的其妙之處。

創(chuàng)建鄰接表的代碼如下。

  1. int n,m,i;   
  2. //u、v和w的數(shù)組大小要根據(jù)實(shí)際情況來設(shè)置,要比m的***值要大1   
  3. int u[6],v[6],w[6];   
  4. //first和next的數(shù)組大小要根據(jù)實(shí)際情況來設(shè)置,要比n的***值要大1   
  5. int first[5],next[5];   
  6. scanf("%d %d",&n,&m);   
  7. //初始化first數(shù)組下標(biāo)1~n的值為-1,表示1~n頂點(diǎn)暫時(shí)都沒有邊   
  8. for(i=1;i<=n;i++)   
  9.     first[i]=-1;   
  10. for(i=1;i<=m;i++)   
  11. {   
  12.     scanf("%d %d %d",&u[i],&v[i],&w[i]);//讀入每一條邊   
  13.     //下面兩句是關(guān)鍵啦   
  14.     next[i]=first[u[i]];   
  15.     first[u[i]]=i;   

接下來如何遍歷每一條邊呢?我們之前說過其實(shí)first數(shù)組存儲(chǔ)的就是每個(gè)頂點(diǎn)ii1~n)的***條邊。比如1號(hào)頂點(diǎn)的***條邊是編號(hào)為5的邊(1 3 7),2號(hào)頂點(diǎn)的***條邊是編號(hào)為4的邊(2 4 6),3號(hào)頂點(diǎn)沒有出向邊,4號(hào)頂點(diǎn)的***條邊是編號(hào)為2的邊(2 4 6)。那么如何遍歷1號(hào)頂點(diǎn)的每一條邊呢?也很簡(jiǎn)單。請(qǐng)看下圖:

遍歷1號(hào)頂點(diǎn)所有邊的代碼如下。

  1. k=first[1];// 1號(hào)頂點(diǎn)其中的一條邊的編號(hào)(其實(shí)也是***讀入的邊)   
  2. while(k!=-1//其余的邊都可以在next數(shù)組中依次找到   
  3. {   
  4.     printf("%d %d %d\n",u[k],v[k],w[k]);   
  5.     k=next[k];   

遍歷每個(gè)頂點(diǎn)的所有代碼如下

  1. for(i=1;i<=n;i++)   
  2. {   
  3.     k=first[i];   
  4.     while(k!=-1)   
  5.     {   
  6.         printf("%d %d %d\n",u[k],v[k],w[k]);   
  7.         k=next[k];   
  8.     }   

可以發(fā)現(xiàn)使用鄰接表來存儲(chǔ)圖的時(shí)間空間復(fù)雜度是O(M),遍歷每一條邊的時(shí)間復(fù)雜度是也是O(M)。如果一個(gè)圖是稀疏圖的話,M要遠(yuǎn)小于N2。因此稀疏圖選用鄰接表來存儲(chǔ)要比鄰接矩陣來存儲(chǔ)要好很多。

原文鏈接:http://ahalei.blog.51cto.com/4767671/1391988

責(zé)任編輯:林師授 來源: 51CTO博客
相關(guān)推薦

2014-03-03 16:44:57

算法

2014-03-26 09:04:42

算法Floyd最短算法

2023-04-13 08:14:53

數(shù)據(jù)結(jié)構(gòu)算法存儲(chǔ)

2019-08-14 10:20:32

算法數(shù)組鏈表

2020-06-28 07:30:00

推薦算法推薦系統(tǒng)

2010-04-28 14:30:18

云計(jì)算

2023-05-05 06:43:13

算法冒泡排序元素

2017-12-28 11:05:38

負(fù)載均衡算法巧妙

2017-06-29 09:15:36

推薦算法策略

2014-12-15 15:33:25

Google測(cè)試馬桶

2020-10-12 11:48:31

算法與數(shù)據(jù)結(jié)構(gòu)

2014-04-11 13:25:01

編程編程效率

2020-10-20 08:14:08

算法與數(shù)據(jù)結(jié)構(gòu)

2021-03-04 17:55:27

算法Raft分布式

2020-06-09 08:13:15

PHP數(shù)據(jù)結(jié)構(gòu)

2022-04-06 10:06:37

判斷算法數(shù)值校驗(yàn)

2022-02-18 08:26:12

TopK數(shù)組面試題

2020-08-10 15:24:05

Snowflake算法開源

2022-05-17 12:23:25

排序算法面試

2018-11-06 12:22:18

排序算法代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

国产精品中文字幕亚洲欧美| 成人午夜看片网址| 久久综合电影一区| 午夜在线视频| 亚洲三级电影网站| 亚洲成熟丰满熟妇高潮xxxxx| 久久99最新地址| 国产欧美日韩视频一区二区三区| 免费欧美一区| 97香蕉超级碰碰久久免费软件| 色豆豆成人网| 欧美一区二区三级| 国产高清免费av在线| 午夜日韩在线电影| 最新理论片影院| 国产精品福利影院| 黄色av免费在线播放| 成+人+亚洲+综合天堂| 青青草视频国产| 国产一区二区在线视频| 欧美连裤袜在线视频| 一本一本久久| 韩国成人动漫在线观看| 国产综合精品一区| 91在线播放视频| 日韩激情图片| 国产精品影片在线观看| 视频在线不卡免费观看| 亚洲精品免费在线视频| 亚洲三级免费| 亚洲精品乱码久久久久久蜜桃91| 蜜乳av一区二区| 警花观音坐莲激情销魂小说| 国产激情偷乱视频一区二区三区| 一卡二卡三卡视频| 国产天堂亚洲国产碰碰| 国产xxxxx| 欧美性感美女h网站在线观看免费| 天堂av电影在线观看| 色婷婷激情综合| 黄色片免费在线观看| 日韩精品在线视频观看| 国产精品99| 91精品成人久久| 欧美在线看片| 亚洲精品一区二区三| 成人午夜短视频| 15—17女人毛片| 香蕉乱码成人久久天堂爱免费| 国产一级在线| 日韩精品一区二区在线| 91精品国产66| 午夜精品久久久久久久久久久久| 欧美女王vk| 国产偷国产偷亚洲高清97cao| 美女视频黄免费的久久| 成人黄色一区二区| 日韩欧美第一页| 七七成人影院| 欧美激情18p| 国语对白精品一区二区| 久久亚洲电影| 国产黄色影视| 亚洲成人免费在线观看| 欧美午夜视频在线| 99精品视频在线免费观看| 超清福利视频| 欧美疯狂做受xxxx富婆| 91国拍精品国产粉嫩亚洲一区| 日韩美女视频免费看| 欧美亚洲网站| 亚洲精选视频在线| 日韩一区二区视频在线观看| 欧美一级视频免费在线观看| 亚洲一区二区三区无吗| 亚洲欧美国产制服动漫| 青青草国产免费一区二区下载| 亚洲一区二区不卡视频| 欧美日韩加勒比精品一区| 偷拍精品精品一区二区三区| 四虎永久精品在线| 一本大道久久a久久综合婷婷| 午夜影院韩国伦理在线| 日韩电影网在线| 午夜视频精品| 色就是色欧美| 亚洲精品伦理在线| 欧美激情影院| 黑人巨大精品| 中文字幕一区久| rebdb初裸写真在线观看| 国产深夜男女无套内射| 伊人伊人伊人久久| 欧美涩涩网站| 亚洲在线视频一区二区| 97视频网站入口| 欧美一级高清片在线观看| 91麻豆精品国产91久久久平台| 波多野结衣精品久久| 亚洲丰满少妇videoshd| 国产丝袜在线观看视频| 精品999在线播放| 亚洲欧美一级| 欧美日韩电影一区二区| 东方欧美亚洲色图在线| 一区二区三区|亚洲午夜| 亚洲欧洲日产国码二区| 羞羞的视频在线观看| 美女999久久久精品视频| 日本人妖一区二区| 成人亚洲视频在线观看| 精品免费国产二区三区| av在线一区二区| 在线播放日本| 久久国产日韩欧美| 亚洲国产小视频在线观看| 亚洲精品国产setv| 最新真实国产在线视频| 青青青在线观看视频| 国产精品九九久久久久久久| 精品视频www| 国产精品福利一区二区| 国产91精品在线| 校园春色综合| 国产一区二区精品在线| 欧美大肚乱孕交hd孕妇| 丝袜亚洲精品中文字幕一区| 日韩欧美小视频| 日韩av色综合| 91福利视频网站| 99精品国产福利在线观看免费| 丝袜+亚洲+另类+欧美+变态| 亚洲一区二区三区香蕉| 国产精品久久久久久亚洲毛片| 黄色精品视频| av漫画网站| 国产精品视频成人| 久久精品男人天堂av| 日本欧美在线| 天天想你在线观看完整版电影免费| 久久久精品欧美| 久久精品国产精品青草| 激情综合网站| 在线天堂资源www在线污| www.亚洲天堂网| 亚洲v国产v在线观看| 69av成年福利视频| 欧美一区永久视频免费观看| 亚洲日本青草视频在线怡红院| 成人久久电影| 澳门成人av网| 亚洲欧美另类图片| 久久国产精品99久久久久久丝袜 | 国产精品午夜免费| 天天做天天爱天天爽综合网| wwwww亚洲| 艳母动漫在线免费观看| 91夜夜未满十八勿入爽爽影院| 亚洲国产精品成人一区二区| 欧美日韩极品在线观看一区| 欧美oldwomenvideos| 青青草超碰在线| 久久99精品国产99久久| 亚洲精品成人久久| 91麻豆免费视频| 国产精品久久占久久| 香蕉久久aⅴ一区二区三区| 亚洲国产午夜伦理片大全在线观看网站 | 日本一道高清一区二区三区| 日本五十路在线| 精品一区在线播放| 一区二区三区回区在观看免费视频 | 欧美一区二区少妇| 韩国精品一区二区三区六区色诱| 精品免费一区二区三区| 成人av网站免费| 欧美亚洲精品在线| 少女频道在线观看免费播放电视剧| 国产一区二区片| 97**国产露脸精品国产| 在线视频一区二区免费| 黄页视频在线91| 免费av高清| 91av亚洲| 日韩网站在线| 国产乱子轮精品视频| 日本一区二区三区高清不卡| 狠狠色综合日日| 久久国产主播| 亚洲欧美激情诱惑| 国产.欧美.日韩| 91在线精品一区二区| 国产一区二区三区综合| 国产一区在线精品| 91蜜桃在线免费视频| 老牛国内精品亚洲成av人片| 男人久久精品| 国产精品网站免费| 99热国产免费| 欧美劲爆第一页|