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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

广度优先搜索(BreadthFirstSearch) 迪克斯特拉算法 (Dijkstra's algorithm)

發(fā)布時(shí)間:2025/5/22 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 广度优先搜索(BreadthFirstSearch) 迪克斯特拉算法 (Dijkstra's algorithm) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

BFS可回答兩類問題:

1.從節(jié)點(diǎn)A出發(fā),有前往節(jié)點(diǎn)B的路徑嗎?

2.從節(jié)點(diǎn)A出發(fā),前往節(jié)點(diǎn)B的哪條路徑經(jīng)過的節(jié)點(diǎn)最少?

BFS中會(huì)用到“隊(duì)列”的概念。隊(duì)列是一種先進(jìn)先出(FIFO, first in first out)的數(shù)據(jù)結(jié)構(gòu),與棧不同,棧是后進(jìn)先出(LIFO, last in first out)的數(shù)據(jù)結(jié)構(gòu)。

還會(huì)用到“字典”的概念。字典在現(xiàn)在很多語言中都存在且廣泛使用,字典中的元素是一組<鍵(key),值(value)>對(duì),key的值是不可以重復(fù)的。關(guān)于字典的詳細(xì)內(nèi)容,網(wǎng)上有很多資料可以查閱。

問題描述:想從你的朋友中找出一個(gè)芒果銷售商,如果你的朋友中沒有,那么就從朋友的朋友中查找。(這里假設(shè)名字最后一個(gè)字母為“m”的即為芒果銷售商)。這樣就是從“you”這個(gè)節(jié)點(diǎn)出發(fā),是否有到“Xm”這個(gè)節(jié)點(diǎn)的路徑的問題。

思路:先從你的朋友開始查找,如果朋友A是芒果銷售商,則程序結(jié)束,如果不是,則將A的朋友排到隊(duì)列中。然后檢查朋友B是否為芒果銷售商,循環(huán),直到找到芒果銷售商或者隊(duì)列中的朋友們都被檢查了一遍。因?yàn)闀?huì)有某個(gè)人C既是A的朋友又是B的朋友,而C只需要檢查一次,因此要分配一個(gè)列表用于記錄已經(jīng)檢查過哪些朋友了。

Python代碼:

>>> from collections import deque>>> graph = {} >>> graph["you"]=["alice","bob","claire"] >>> graph["bob"] = ["anuj","peggy"] >>> graph["alice"] = ["peggy"] >>> graph["claire"]=["thom","jonny"] >>> graph["anuj"]=[] >>> graph["peggy"]=[] >>> graph["thom"]=[] >>> graph["jonny"]=[]>>> def search(name):search_queue = deque()search_queue += graph[name]searched = []while search_queue:person = search_queue.popleft()if person not in searched:if person_is_seller(person):print (person + " is a mango seller!")return Trueelse:search_queue += graph[person]searched.append(person)return False>>> def person_is_seller(name):return name[-1] == 'm'>>> search("you") thom is a mango seller! True

?C#代碼:

namespace Algorithms {public static class BFS{public static bool BreadthFirstSearch(string name, Dictionary<string,List<string>>graph){Queue<string> search_queue = new Queue<string>();foreach (var item in graph[name])search_queue.Enqueue(item);List<string> searched = new List<string>();while (search_queue.Count != 0){string person = search_queue.Dequeue();if (!searched.Contains(person)){if (JudgeSeller(person)){Console.WriteLine(person + " is a mango seller!");return true;}else{foreach (var item in graph[person])search_queue.Enqueue(item);searched.Add(person);}}}return false;}private static bool JudgeSeller(string name){if (name[name.Length - 1] == 'm')return true;return false;}} }

測(cè)試:

namespace Algorithms {class Program{static void Main(string[] args){Dictionary<string, List<string>> graph = new Dictionary<string, List<string>>();graph["you"] = new List<string>() { "alice", "bob", "claire" };graph["alice"] = new List<string>() { "peggy" };graph["bob"] = new List<string>() { "anuj", "peggy" };graph["claire"] = new List<string>() { "thom", "jonny" };graph["anuj"] = new List<string>();graph["peggy"] = new List<string>();graph["thom"] = new List<string>();graph["jonny"] = new List<string>();if (!BFS.BreadthFirstSearch("you", graph)){Console.WriteLine("no mango seller!");}Console.Read();}} }

?Dijkstra's algorithm 用于計(jì)算出最短路徑,但是這個(gè)算法在使用上有很多限制條件。

問題描述:從A地到B地的各種可能的路徑中,哪條路徑所用的時(shí)間最短。(圖中的數(shù)字表示從某地到另外某地所用的時(shí)間)

?

?

?

圖1

思路:記錄從A點(diǎn)到其他各個(gè)節(jié)點(diǎn)的所需的時(shí)間,如表1所示(現(xiàn)在還不知道從A到B的時(shí)間,則先設(shè)置為無窮大)

D3
C7
B

?

表1

?

?

從所需時(shí)間最短的D點(diǎn)再出發(fā),計(jì)算從A經(jīng)過D到其他個(gè)各節(jié)點(diǎn)的時(shí)間,如表2所示

?

C5
B10

表2

?

?

直接前往C點(diǎn)需要的時(shí)間為7,而經(jīng)過D點(diǎn)前往C點(diǎn)所需的時(shí)間為5,時(shí)間縮短了,則更新從A到各個(gè)點(diǎn)所需的時(shí)間的列表,如表3所示

?

D3  
C5
B10  

?

表3

?

?

現(xiàn)在除了節(jié)點(diǎn)D之外,從A到C的時(shí)間是最短的了,則計(jì)算從A經(jīng)過C再到其他節(jié)點(diǎn)的時(shí)間,如表4所示。

?

B7

表4

?

現(xiàn)在從A經(jīng)過D再經(jīng)過C然后到B的時(shí)間為7,小于表3記錄的到B的時(shí)間,則更新這個(gè)時(shí)間。

就這樣得到了花費(fèi)時(shí)間最短的路徑。總結(jié)一下就是,不斷的獲得從起點(diǎn)到某點(diǎn)的最短時(shí)間,然后更新這個(gè)時(shí)間列表。在?Dijkstra's algorithm中,這些數(shù)字被稱為“權(quán)重(weight)”,而帶權(quán)重的圖則被稱為加權(quán)圖(weighted graph),那么不帶權(quán)重的則被稱為非加權(quán)圖(unweighted graph)。對(duì)于計(jì)算非加權(quán)圖中的最短路徑,可使用BFS,計(jì)算加權(quán)圖中的最短路徑,可使用?Dijkstra's algorithm。然而,?Dijkstra's algorithm不適用于帶環(huán)的圖,即圖1中的箭頭如果是雙向的話那么就是不適用的。此外,它還不適用于帶有負(fù)權(quán)重的情況

Dijkstra算法的實(shí)現(xiàn)需要使用三個(gè)散列表。第一個(gè)散列表記錄的是每個(gè)點(diǎn)的鄰居及權(quán)重。第二個(gè)散列表記錄的是從起點(diǎn)開始到每個(gè)節(jié)點(diǎn)的權(quán)重,第三個(gè)散列表記錄的是各個(gè)節(jié)點(diǎn)父節(jié)點(diǎn)。

Python代碼:

#第一個(gè)散列表,記錄每個(gè)點(diǎn)的鄰居及權(quán)重 graph={} graph["A"]={} graph["A"]["C"]=7 graph["A"]["D"]=3 graph["C"]={} graph["C"]["B"]=2 graph["D"]={} graph["D"]["C"]=2 graph["D"]["B"]=7 graph["B"]={}#第二個(gè)散列表,記錄從起點(diǎn)A到其他各個(gè)節(jié)點(diǎn)的權(quán)重 #由于節(jié)點(diǎn)B不是A的鄰居,則A到B的權(quán)重暫設(shè)置為無窮大 costs={} infinity = float("inf") costs["C"]=7 costs["D"]=3 costs["B"]=infinity#第三個(gè)散列表,用于存儲(chǔ)節(jié)點(diǎn)的父節(jié)點(diǎn) parents={} parents["C"]="A" parents["D"]="A" parents["B"]=None#用于記錄已經(jīng)處理過的節(jié)點(diǎn)的數(shù)組 processed=[]#先在未處理的節(jié)點(diǎn)數(shù)組中找到權(quán)重最小的節(jié)點(diǎn) def find_lowest_cost_node(costs):lowest_cost = float("inf")lowest_cost_node = Nonefor node in costs:cost = costs[node]if cost < lowest_cost and node not in processed:lowest_cost = costlowest_cost_node = nodereturn lowest_cost_nodenode = find_lowest_cost_node(costs) while node is not None:cost = costs[node]neighbors=graph[node]for n in neighbors.keys():new_cost=cost + neighbors[n]if costs[n] > new_cost:costs[n] = new_costparents[n]=nodeprocessed.append(node)node=find_lowest_cost_node(costs)for node in costs:print("Node:" + node+ " Cost:" + str(costs[node]) + "\r\n")for node in parents:print("ChildNode:" + node + " ParentNode:" + parents[node] + "\r\n")

運(yùn)行結(jié)果:

Node:C Cost:5Node:D Cost:3Node:B Cost:7ChildNode:C ParentNode:DChildNode:D ParentNode:AChildNode:B ParentNode:C>>>

C#代碼:

public class DijkstraAlgorithm{public Dictionary<string, double> Costs { get; set; }public Dictionary<string, string> Parents { get; set; }public Dictionary<string, Dictionary<string,double>> Graph { get; set; }private List<string> processed = new List<string>();public DijkstraAlgorithm(){Costs = new Dictionary<string, double>();Parents = new Dictionary<string, string>();Graph = new Dictionary<string, Dictionary<string, double>>();}public void Dijkstra_Algorithm(){string node = FindLowestCostNode();while(node != null){double cost = Costs[node];Dictionary<string, double> neighbors = Graph[node];foreach(KeyValuePair<string,double> item in neighbors){double new_cost = cost + item.Value;if (Costs[item.Key] > new_cost){Costs[item.Key] = new_cost;Parents[item.Key] = node;}}processed.Add(node);node = FindLowestCostNode();}}private string FindLowestCostNode(){string lowestcostnode = null;double lowestcost = double.PositiveInfinity;foreach(KeyValuePair<string,double> item in Costs){if(item.Value < lowestcost && !processed.Contains(item.Key)){lowestcost = item.Value;lowestcostnode = item.Key;}}return lowestcostnode;}}

字典的初始化以及運(yùn)行結(jié)果:

DijkstraAlgorithm Dalgorithm = new DijkstraAlgorithm();Dalgorithm.Graph["A"] = new Dictionary<string, double>();Dalgorithm.Graph["A"]["C"] = 7;Dalgorithm.Graph["A"]["D"] = 3;Dalgorithm.Graph["C"] = new Dictionary<string, double>();Dalgorithm.Graph["C"]["B"] = 2;Dalgorithm.Graph["D"] = new Dictionary<string, double>();Dalgorithm.Graph["D"]["C"] = 2;Dalgorithm.Graph["D"]["B"] = 7;Dalgorithm.Graph["B"] = new Dictionary<string, double>();Dalgorithm.Costs["C"] = 7;Dalgorithm.Costs["D"] = 3;Dalgorithm.Costs["B"] = double.PositiveInfinity;Dalgorithm.Parents["C"] = "A";Dalgorithm.Parents["D"] = "A";Dalgorithm.Parents["B"] = null;Dalgorithm.Dijkstra_Algorithm();foreach(KeyValuePair<string,double> item in Dalgorithm.Costs){Console.WriteLine("Key : " + item.Key + " Value : " + item.Value);}foreach(KeyValuePair<string,string> item in Dalgorithm.Parents)Console.WriteLine("Key : " + item.Key + " Value : " + item.Value);Console.Read();

轉(zhuǎn)載于:https://www.cnblogs.com/larissa-0464/p/10633934.html

總結(jié)

以上是生活随笔為你收集整理的广度优先搜索(BreadthFirstSearch) 迪克斯特拉算法 (Dijkstra's algorithm)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 毛片网络 | 日韩av一卡 | 性爱视频日本 | 国产激情无套内精对白视频 | 国产精品扒开腿做爽爽 | 欧美一级特黄aa大片 | 精品女同一区 | 亚洲三级精品 | 久久狠| 欧美激情免费视频 | 国产精品99久久久 | 少妇又色又爽又高潮极品 | 姝姝窝人体www聚色窝 | 亚洲欧洲综合网 | 理伦毛片 | 天堂久久网 | 岛国大片在线免费观看 | 羞羞的软件 | 黄网在线免费 | 18岁毛片 | 懂色av| 中文字幕中文字幕 | 蜜臀av免费一区二区三区水牛 | 九九久久综合 | 亚洲国产黄 | 亚洲专区在线播放 | 粉豆av| 亚洲精品在线观看视频 | 日本婷婷 | 福利视频一二区 | 在线观看免费人成视频 | 久99久视频| 亚洲欧美视频一区二区 | 国产精品无码电影 | 在线视频观看一区二区 | 精品不卡一区二区三区 | 中国女人做爰视频 | 男操女视频在线观看 | 51吃瓜网今日 | 日本一二三不卡 | 性生生活性生交a级 | 午夜男人网 | 欧美精品色婷婷五月综合 | 一级aaa毛片 | 免费观看黄色av | 亚洲av综合永久无码精品天堂 | 国内精品久久久久久久久久久 | 手机在线免费av | 亚洲天堂欧美 | 草草地址线路①屁屁影院成人 | 超碰av男人的天堂 | 黄色欧美一级片 | 男生吃小头头的视频 | 精品国产一区二区三区日日嗨 | 久久丫精品久久丫 | av在线小说 | 一本一道波多野结衣av黑人 | 久久久老熟女一区二区三区91 | 亚洲av无码久久精品色欲 | 国产无精乱码一区二区三区 | 8x8ⅹ国产精品一区二区 | 欧美自拍偷拍一区二区 | 性感美女黄色片 | 少妇一级淫片免费看 | 欧美三级午夜理伦三级小说 | 99re在线国产 | 欧美日韩久久久久久 | 国产刺激高潮av | 天天舔天天操天天干 | 国产精品一区二区三区免费看 | 久久久黄色大片 | 青青草精品在线视频 | 国产一级二级视频 | 最新亚洲精品 | 国产福利二区 | 亚洲国产情侣 | 伊人久久综合 | 韩国黄色视屏 | 人妻内射一区二区在线视频 | 91久久一区二区 | 在线观看网站av | 免费看日韩 | 九月婷婷| 欧美理论在线 | 永久免费黄色 | 成人动漫av在线 | 优优色综合 | 国产一区二区三区视频 | 天堂在线中文字幕 | 国产高清久久 | 国产毛片毛片毛片毛片毛片 | 免费污视频在线观看 | 朝鲜一级黄色片 | av一卡| 亚洲视频免费观看 | 婷婷综合av| 国产视频在线观看一区二区 | 日韩精品二区在线观看 | 亚洲自拍第二页 |