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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图的最短路径(一级)

發布時間:2024/4/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图的最短路径(一级) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

下面我們來講圖里面的最后一個內容,最短路徑,我們已經有一個初步的認識,比如我在高德地圖里面駕車,給我多條路徑,實際上這三條路徑都是最短路徑,他們都是最短路徑,只不過是按照不同的標準,不同標準比出的路徑,不見得是具體最短,也可能是擁堵最少,或者紅綠燈最少,那他怎么知道紅綠燈最少呢,他怎么知道擁堵最少呢,他怎么知道距離最短呢,就是靠各條邊的權值,就靠權值的,比如兩個點之間有一個權值代表距離,就好比,我要從a到e,如果3代表距離的話,我要找距離最短的,如果3代表擁堵程度的話,我要找擁堵值最少的,這是一個,我們來解決這個問題,最短路徑,在很多應用里面,帶權圖這個值是有作用的,用來描述整個網絡的,比如通信網絡,交通網絡,交通網絡可以代表距離,可以代表紅綠燈,可以代表擁堵程度,這種情況下,各邊的權重就對應于兩點之間的通信的成本或交通的費用,這個時候,就有一個典型的問題就是,在任何的兩點之間如果存在通路,那么最少的消耗是什么,這是一點,這是一點,他們中間其實還有很多點,他們中間還有很多點的,他們并沒有直接相連,就好比一個是a,一個是e,他不是直接相連的,他們是通過其他節點串聯起來的,而連起來的,是這么來的,最短路徑,我們要求他們之間最少的消耗是多少,那在我們的圖里面,數據結構里面,我們用一個專門的名詞來解決這個問題,叫最短路徑,這是一個網絡,比如交通網,并且這個有方向的,有方向的什么意思,v1能到v2,v2就不能到v1,就不能到這兒,大家要記住,我們的目的是要從v1到v8,我要從v1到v8,你看這個路徑可多了去了,我想找里面的最短路徑,最短路徑里面有兩類,有人說我直接走,一個5,一個2,這里一個9,如果這個權代表時間的話,你這么看著直接走,你花的時間很多的,你花的時間很多,你要是換一個來說,你有時候發現走了好幾條邊,那可能還少呢,3,1,1三條邊權值加起來才是5,所以這一塊,從v1到v8,最短路徑是什么,有人說我一眼能看出來,你能看出來嗎估計夠嗆吧,北京的交通地鐵圖放在這兒,你能看出來嗎,看不出來,是不是要靠算法去算,靠計算機來計算,寫完代碼要計算,是這么來做的,我們把最短路徑分為兩大類來討論 第一類跟權值無關的,段數最少的最短路徑,生活案例就是換乘最少,最好是能這么來,這邊一上一個公交,一直把我拉到這兒來這是一個站,這是一個站,中間不用換乘,哪怕饒了非常遠,我也愿意,為什么,因為我的行李比較多,因為我還有這個需求,因為我的路不熟,我第一次來北京,我就想一上公交,就直接把我拉到目的地了,有這個需求嗎,是有的,換乘最少,我這個時候和你的時間,和你的擁堵有沒有關系,沒有關系,換乘最少就好,那這個怎么辦啊,跟上面的權值有沒有關系,沒有關系,我就看怎么跳,從v1到v3跳一次,v3到v6換一次,v6到v8就到了,怎么經過的頂點少,就走哪一個,這是一類問題,這個跟權值無關,這個怎么來解決呢,只用廣度優先搜索就可以了,注意我們這里寫的是廣度優先搜索,沒有寫廣度優先遍歷,還是有點差別的,基本道理是一樣的,它相當于我們這個廣度優先遍歷在這里的一個應用,這是一個還有一個,權值最少,可能是時間最少,也可能是距離最短,到底是時間最少還是距離最短呢,那就要看這個權值代表什么含義了,如果你這權值代表距離,那我就要找代表距離最短的,如果你的權值代表時間,我就要找時間最少的,知道我們在說什么吧,然后我們就開始做了,看這一個 第一個問題特別簡單,段數最少,換乘最少的,還是就相當于樹的遍歷,需要借助隊列來實現,怎么來辦呢,我們大家畫一下,跟我們剛才講的廣度優先遍歷差不多,先畫一個隊列,隊列在這兒,先把誰放進去,比如我們v1就不放了,因為我們是從v1出發的,我們要的是段數最少我們來處理或者來看的話,我們就得從第一個開始看,你不能想當然的想一個,這樣不保險,大家不要想換乘最少,就快速的得到一個結果不可能的,還是的從第一個,第二個,他還是要經過一系列的比較來實現的,那請問我們的v1要到哪些頂點,與v1之間的相連的換乘點,有哪些,有v2,我們就直接寫數了,v3,還有誰啊,還有v4,如果我到這三個頂點的話,相當于我直接到了,直接到就可以了,但是你要好好看,234里面是不是8,不是,你先找到與v1相連的連接點,看到他們是不是v8啊,不是,不是怎么辦,不是我們就得找,2你是我的目的地嗎,不是那如果從你這里出發,一步直接到是不可能了,最好是換乘一次了,那好,與v2直接相連的有誰,有v5,有v6,是不是還有v3,那這個時候我們怎么辦,比如我們寫一個3,有人說我們這個3到底寫不寫,就看算法里面怎么實現了,反正這個3要標記一下,就已經訪問過的,我們要做一下相關標記的,這個明確一下,比如我們3先寫到這里吧,先2已經出去了,2肯定是已經訪問過了,2是到不了的,與2相連的3還有多少5,6,到這兒,然后我們再看這個3,3能不能直接到啊,3是不是我的目的地啊,不是我們的目的地,與3直接相鄰的有誰,有6,有4,還有沒有,沒有了吧,4是不是我們的目的地啊,不是,那如果我們通過4到的話,6和7,如果我們能夠到這3個頂點的話,可以直接到了,那現在我們是到不了的,因為234都不是我們的8,那下面的頂點里面,如果包括我們的目的地,相當于換乘一次就夠了,那我們來看唄3就已經不考慮了,你之前已經訪問過3了,5是不是我們的目的地啊,5不是8,那就5出去,5出去之前要做一件事,5可以到誰,5能到6嗎5到不了,是不是到不了,5能到8,這兒寫一個8就可以了,這兒寫一個8,然后我們再來看,5出去了,6不是我們的目的地,但是6可以到7,到8,6可以到7也可以到8,我們在畫這個隊列了,這個6已經不處理了,因為已經處理過了,4處理過了,6處理過了,7可以到誰啊,7可以到8,如果你在這一段里面包括我們的目的地的話,相當于中間換乘一次,第二次就直接到了,但是這里面有沒有啊,這里面沒有,那我們再往下看,8是我們的目的地嗎,那我們就可以達到了,換乘兩次就可以到,如果我們把問題變一下,我要從v1出發,我要到v9,v9會怎么樣,這里面有沒有v9,沒有v9,你怎么知道沒有v9了,就是把我們隊列里所有的元素都走一遍,走到最后,隊列成了空了,也沒有找到v9,那就不存在了,這就是關于段數最短的一端路徑,可按照這種方式來實現,看來這就是一個簡單的思路我們現在知道到8了,你怎么知道是跳了兩次呢,那跳了兩次,哪一塊路徑 是兩次啊,你看這是一條路徑,還有別的嗎,別的還有沒有,這是不是兩次,這是不是兩次,你還要記住這條路徑是哪條路徑,比如我換成3次,那還要知道具體走的是哪一個頂點,根據算法的進一步的細節了,對于我們來說呢,我們要知道,我們要記住這樣一個結論,什么結論,求最短路徑,段數最少,跟權值無關,用什么來實現用廣度優先搜索來實現,廣度優先搜索是怎么回事,跟我們之前的廣度優先遍歷很相似,需要借助隊列來實現,先找與起點直接到達的頂點,看直接打到的頂點是不是我們的目的地,如果不是的話,再找他的下一個換乘點,就可以了,就一步一步推,就好比一步一步的擴散唄,怎么擴散啊,這是起點,這里面有沒有,這是直接到的,沒有,再找換乘的,換乘一次的,再找換乘兩次的,換乘三次的,看換乘幾次,找最早能找到的8,最早找到的v8,肯定是我們換乘最少的,這是一個,這個內容我們就給大家說到這兒 那下面我們要看后面這個問題,這個問題就要稍微復雜一下了,但是也特別有意思,權值最小,我要的是時間最少和距離最短看著我要從v1出發,我要借助這些權值,到v8,有一條路徑,各個路徑最后權值是最小的,那這個時候我該怎么辦,我直接走唄,直接過去,5+2+9,16,這是不是最小的,比如我先走2,在走3,或者我不說別的,v6到v8是不是9啊,但是我繞一下,先到7再到8,是不是1+6啊,比直接走這個9是要小啊,那這個路徑就可以排除了,關鍵是有眾多的路徑,大家想一下交通圖,那個路徑不計其數啊,我怎么從里面找到最合適的,這么來寫哦,這個人叫狄克斯特拉,人家專門研究這個問題,給出了一個解決方案,所以這個算法的名字,是以人家的名字來命名了,中間要經過一系列的過程,過程就在這兒,他一直在重復一個操作,不復雜,首先要明白他的起點是什么,所有的頂點有8個,起點是誰,v1,他的初始狀態是這么來的,我先定義一個數組,這個數組目前只有一個頂點,我的起點v1,還有一個數組T數組,他有誰啊,他有其他所有的頂點,然后呢我這里還維持著一張表,一個表格,當前節點是除了起點之外,所有的頂點,因為我這里沒有任何的計算,我目前暫且認為起點到這些頂點最短距離都是-1,-1就認為無窮大,注意了,因為我還沒有計算,所以我暫且認為v1到這些頂點的最少路徑,目前都是無窮大,我們用-1來表示,這是初始狀態,我們經過一系列的運算之后,最終得到了一個結果,這個最終的結果是什么,結果就是T數組里面的元素,一個也沒有了,都到S數組里面了,S數組里面原始只有一個v1,但是我們經過各個步驟之后,已經把T數組里面的值,依次的已經放到我們的S數組里面了,已經全了,但是你仔細看,他放的順序不是隨便放的,是按照234的順序來嗎,不是吧,6,7,5,8,他是有一點依據的,一個一個放進去的,當我們把T數組的元素都放到S數組里面的時候我們同時也得到了一張表,這個表就在這兒,我們又得出一個結論,從這個起點到v8,他的最短距離是多少啊,是12,最短距離是12,我們不僅得到了v1到v8的最短距離是12,我們還得到了v1到其他各個頂點的距離,比如v1到v2,...v8的最短距離分別是3,4,5,8,6,7,12,這個表是不是非常有用啊,是v1到各個節點的最短距離,我的成果有第一個,知道v1出發,到網絡中各個節點的最短距離,這個成果是很豐碩的,并且我還知道,我從v1出發,到v8這個路徑是12,那走的是那一條路徑,就在這個表格里面存著呢,怎么存著呢,v8的前一個節點是誰,是v7,v6的前一個節點是v6,v6的前一個節點是v3,v3的前一個節點是v2,v2的前一個節點是v1,大家記住了,回到這里來,看對不對,這就是我們所說的最短路徑,那我要想找v1到v5的最短距離呢,也在這個表里面,這個表里面都有,比如我想到v5的最短距離,v1到v5的最短距離是8,從v5前一個是v6,v6的前一個是v3,v3的前一個是v2,v2的前一個是v1,大家記住這么一個順序了,我們到的是v5,12365,看是不是,我們講到這想一下,就是一個表格包含的內容太多了不僅有最短距離,而且包括最短的路徑,下面我們就一步一步的來實現 我們來研究一下這個算法,我們要記住這個人的名字,使用狄克斯特拉,當然是英文單詞翻譯過來的,我們把這個問題說明白,這里又一個專門的表格,就是剛才的內容,打起精神來,雖然是了解性的,但是你不覺得很有意思嗎,看這一塊啊,我們開始回答這個問題了,初始狀態是S數組,里面只有起點,T數組有其他所有的頂點,v1到其他頂點的距離,暫且認為無窮大,下一步,我要找與v1直接相連的頂點,先找與v1直接相連的頂點,里面有誰,v2,v3,v4,距離是幾,3,5,6,v1是不是可以達到這三個頂點,3,5,6,v1到這三個頂點還是無窮大嗎,不是的,更新這個表,怎么更新了,到v3,到v4的距離是3,5,6,前一個頂點是誰,是從v1到達的這兒,這是我們的一個成果 下一步怎么辦,我們要從這個距離里面找到一個最小的值,哪個值最小啊,你可不能說不一樣,-1是無窮大的,是不是3最小3最小怎么辦,3代表誰啊,3代表v2,從下面這個數組里面把值最小的v2拿出來,放到這兒,這個圖是哪個圖啊,那下面我們要干什么了,下面我們要從v2出發,看他可以到哪些頂點,v2可以直接到v3,可以直接到v5,可以直接到v6,距離分別是多少,到v3是1,到v5是7,到v6是4,那大家想一想,這個v1到v2距離是不是3,那請問,我們這個v1到v3,v5,v6的距離,應該是多少啊,我從v2到這三個的距離,是不是1,7,4,如果不是從v2出發,從v1出發,你這個距離是不是要加上一個3,再加上3,因為3是我們所有路徑最短的嗎,從v1到v2的距離,3和1,7,4分別相加,這是4,這是10,這是7,我們就可以再改變一下了,本來v1到v5到v6都是無窮大,現在變成多少了,現在變成10和7了,就是v1到v5到v6的距離,一個是10,一個是7,是不是要比無窮大小啊,改一下,怎么改,這兒改成10,這兒改成7,上一個頂點是誰,v2,那是這么來的,明確一點,上個節點是v2,4要不要改啊這個4要不要改,你看哦,4是什么意思,也就是我們從v1到v3,直接走這個路徑是5,現在我又算了一下,我要走這個路徑居然是4,那怎么辦,是不是要把這個路徑替換一下,替換一下,把這兒改成4,還要改一個位置,我們到達v3的前一個頂點可是通過v2定的,還是通過v1嗎,不是的,我們這一步就做到這兒,在這個成果里面我們還要找一個最小的,之前的v2'早已經加進來了,就是在v3和v8里面找最小的,現在是v3,那我們要做一件事,提出來怎么辦,在這個圖里面找,從v3出發,可以直接到誰,可以直接到v4,從v3到v4的距離是1,還有誰到誰,到v6,這是2,可是你不要忘了,我們要從v1出發,最終到達v3,是不是花的距離是4,花的權值是不是4,那我要拿這個4,跟這個1相加,是幾啊,是5,拿著這個和2相加是6,這什么意思啊,6是比這個7小啊,5是不是比這個6小啊,這說明什么,我們找到了一個更短的路徑,當然我們的最短路徑是借助誰實現的,是借助這個v3來實現的,不再是通過v1,不再是通過v2了,我們要做一個操作,把這個值改成5,把這個值改成6,還要再做一點,再改什么位置,到達v4和v6的前一個頂點是通過誰啊,是通過v3嗎,把v1和v2改了,直接改成v3,改他就可以了,告訴我,下面就是完全重復了,我們又得到這個結果,告訴我們該干什么,下邊我們要干什么,這個v2,v3已經進到上面這個數組里面了,剩的是不是45678,找一個權值最小的,是5,權重是5,節點是v4,把這個v4放進來,放進來之后要干什么,以v4為頂點,他直接相鄰的頂點有誰,有v6,v7,分別是幾,3和5,一個3一個5,v1到v4的最短距離是幾,是5,3加5是幾啊,8,5+5是幾啊,10,下邊我們要干什么,8和6比8要大,你這個不是最短路徑,但是這個10呢,到7的話,之前還是無窮遠啊,現在是10,這要變一下,怎么改,這個6是不變的,這個-1要變成10還要變一下,怎么達到這個v7的,他的前一個頂點是v4,我們又得到了這么一個結果 再往下看,我們要在5678里面找到一個節點,找到一個值最小,是不是6啊,那我們就要做一件事了,把這個v6加到里面我們就把它講完吧,怎么辦,以v6為頂點,他可以直接到誰,直接到v5,直接到v7,直接到v8的,并且到v5是2,到v7是1,到v8是9,然后干什么呢,v6進去了,v1到v6的最短距離是6,他是6的,6+2是幾啊,8,6+1是7,6+9是15,拿著這個8和10相比,我們又找到了一個最短路徑,把這兒改成8,前一個點是v6,拿著7和10比,這要改成7,前一個頂點是通過v6來找的,拿著15和無窮大比,這兒要改成15,我們又得到了一個結果,一步一步來的,這個時候T數組里面還剩幾個,還剩3個,一個v5,是8,一個v7是7,一個v8是15,8,7,15里面最小的是7,我們把7放進來,又出現了什么情況,7可以到誰,7只能到8,權值是5,而我們要知道,從v1到v7,最短路徑現在是7,7+5是幾,12,拿著12和15相比較,12小于15,又找到一條最短路徑,前一個節點是誰,是v7l,又解決了,然后怎么辦,然后我們在v7,v8里面,找一個小的值一個是8,一個是12,把v5提上去,再來看,v5可以到v8,只是權值是6,而我們要知道他到v5的距離是8,8+6是幾,是14,14和12比,12還是最短的,不走你這個路徑,再往下走,不用走了,因為這里面就剩下一個節點就剩下一個v8了,v8就是我們的目的地,直接把v8加進來,最終我們就得到這樣一個結果,這個結果告訴你什么,從v1出發到v8的最短距離是12,這是第一個成果,其實這個值就是起點為1,到這些頂點的最小距離,都求出來了如果你要是換一個頂點,從v2出發,你可以求出v2到其他頂點的最短距離,也是可以求獲的,并且我們這里還可以干什么,還可以知道怎么從v1出發,怎么到達v8的,就是前面這一列起作用了,v8的前一個是v7,v7的前一個是v6,v6的前一個是v3,v3的前一個是v2,v2的前一個是起點v1,那關于最短路徑就給大家說道這里了 再次總結,最短路徑在實際的應用中還是特別有用的,段數最少的與權值無關,直接用廣度優先搜索就可以了,需要借助隊列,權值最小的,這里權值代表什么含義,不確定,可能是時間,也可能是距離,也可能是擁堵,都有可能,狄克斯特拉算法,最終我們會得到這樣的一個結果

?

總結

以上是生活随笔為你收集整理的图的最短路径(一级)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。