精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

圖算法系列之計算圖中最短路徑

網絡 通信技術 算法
在前面兩篇中我們通過深度優先搜索可以從圖中找出一條通過頂點v到頂點w的路徑,但是深度優先搜索與頂點的輸入有很大的關系,找出來的路徑也不一定是最短的,通常情況下我們很多時候需要找出圖中的最短路徑,比如:地圖功能。

[[398324]]

本文轉載自微信公眾號「貝塔學JAVA」,作者Silently9527。轉載本文請聯系貝塔學JAVA公眾號。

前言

在前面兩篇中我們通過深度優先搜索可以從圖中找出一條通過頂點v到頂點w的路徑,但是深度優先搜索與頂點的輸入有很大的關系,找出來的路徑也不一定是最短的,通常情況下我們很多時候需要找出圖中的最短路徑,比如:地圖功能。這里我們就需要使用到廣度優先搜索算法

廣度優先搜索

依然使用之前定義的尋找路徑的API

  1. public class Paths { 
  2.     Paths(Graph graph, int s); 
  3.      
  4.     boolean hasPathTo(int v); //判斷出從s->v是否存在路徑 
  5.      
  6.     Iterable<Integer> pathTo(int v); //如果存在路徑,返回路徑 

在廣度優先搜索中,為了找出最短路徑,我們需要按照起點的順序來遍歷所有的頂點,而不在是使用遞歸來實現;算法的思路:

  • 使用隊列來保存已經被標記過但是鄰接表還未被遍歷過的頂點
  • 取出隊列中的下一個頂點v并標記它
  • 將v相鄰的所有未被標記的頂點加入到隊列

在該算法中,為了保存路徑,我們依然需要使用一個邊的數組edgeTo[],用一顆父鏈樹來表示根節點到所有連通頂點的最短路徑。

  1. public class BreadthFirstPaths { 
  2.     private boolean marked[]; 
  3.     private int[] edgeTo; 
  4.     private int s; 
  5.     private Queue<Integer> queue = new LinkedListQueue<>(); 
  6.  
  7.     public BreadthFirstPaths(Graph graph, int s) { 
  8.         this.s = s; 
  9.         this.marked = new boolean[graph.V()]; 
  10.         this.edgeTo = new int[graph.V()]; 
  11.  
  12.         bfs(graph, s); 
  13.     } 
  14.  
  15.     private void bfs(Graph graph, int s) { 
  16.         this.marked[s] = true
  17.         this.queue.enqueue(s); 
  18.         while (!this.queue.isEmpty()) { 
  19.             Integer v = this.queue.dequeue(); 
  20.             for (int w : graph.adj(v)) { 
  21.                 if (!this.marked[w]) { 
  22.                     this.marked[w] = true
  23.                     this.edgeTo[w] = v; 
  24.                     this.queue.enqueue(w); 
  25.                 } 
  26.             } 
  27.         } 
  28.  
  29.  
  30.     } 
  31.  
  32.     public boolean hasPathTo(int v) { 
  33.         return this.marked[v]; 
  34.     } 
  35.  
  36.     public Iterable<Integer> pathTo(int v) { 
  37.         if (!hasPathTo(v)) { 
  38.             throw new IllegalStateException("s不能到達v"); 
  39.         } 
  40.         Stack<Integer> stack = new LinkedListStack<>(); 
  41.         stack.push(v); 
  42.         while (edgeTo[v] != s) { 
  43.             stack.push(edgeTo[v]); 
  44.             v = edgeTo[v]; 
  45.         } 
  46.         stack.push(s); 
  47.         return stack; 
  48.     } 

以下圖為列,來看看廣度優先搜索的運行軌跡

 

單元測試的代碼:

  1. @Test 
  2. public void test() { 
  3.     Graph graph = new Graph(8); 
  4.     graph.addEdge(0, 1); 
  5.     graph.addEdge(0, 2); 
  6.     graph.addEdge(0, 5); 
  7.     graph.addEdge(1, 3); 
  8.     graph.addEdge(2, 4); 
  9.     graph.addEdge(4, 3); 
  10.     graph.addEdge(5, 3); 
  11.     graph.addEdge(6, 7); 
  12.  
  13.     BreadthFirstPaths paths = new BreadthFirstPaths(graph, 0); 
  14.     System.out.println(paths.hasPathTo(5)); 
  15.     System.out.println(paths.hasPathTo(2)); 
  16.     System.out.println(paths.hasPathTo(6)); 
  17.  
  18.     paths.pathTo(5).forEach(System.out::print); 
  19.     System.out.println(); 
  20.     paths.pathTo(4).forEach(System.out::print); 
  21.     System.out.println(); 
  22.     paths.pathTo(2).forEach(System.out::print); 
  23.     System.out.println(); 
  24.     paths.pathTo(3).forEach(System.out::print); 
  25.  

執行的結果與我們分析的運行軌跡一致

符號圖

最近幾篇文章一起學習到的圖算法都是以數字作為了頂點,是因為數字來實現這些算法會非常的簡潔方便,但是在實際的場景中,通常都是使用的字符作為頂點而非數字,比如:地圖上的位置、電影與演員的關系。

為了滿足實際的場景,我們只需要在數字與字符串的關系做一個映射,此時我們會想到之前文章實現的map(通過二叉樹實現map、紅黑樹實現map、哈希表實現map等等,有興趣的同學可以去翻翻),使用Map來維護字符串和數字的映射關系。

  1. public interface SymbolGraph { 
  2.     boolean contains(String key); //判斷是否存在頂點 
  3.  
  4.     int index(String key); //通過名稱返回對應的數字頂點 
  5.  
  6.     String name(int v); //通過數字頂點返回對應的字符名稱 
  7.  
  8.     Graph graph(); 

實現的思路:

  • 使用Map來保存字符串-數字的映射,key為字符串,value為數字
  • 使用一個數組來反向映射數字-字符串,數組的下標對應數字頂點,值對應字符串名稱
  • 假設構造圖的頂點與邊是通過字符串來表示的,如:a,b,c,d\nb,a,h,l,p\ng,s,z 使用\n分隔的每段第一個字符串表示頂點v,后面的表示與頂點v相連的相鄰頂點;

實際的過程可以根據具體情況來確定,不一定非得這種字符串,可以來源于數據庫,也可以來源于網路的請求。

代碼實現如下:

  1. public class SymbolGraph { 
  2.     private Map<String, Integer> map = new RedBlack23RedBlackTreeMap<>(); 
  3.     private String[] keys; 
  4.     private Graph graph; 
  5.  
  6.     public SymbolGraph(String text) { 
  7.         Arrays.stream(text.split("\n")).forEach(line -> { 
  8.             String[] split = line.split(","); 
  9.             for (int i = 0; i < split.length; i++) { 
  10.                 map.put(split[i], i); 
  11.             } 
  12.         }); 
  13.  
  14.         this.keys = new String[map.size()]; 
  15.         map.keys().forEach(key -> { 
  16.             this.keys[this.map.get(key)] = key
  17.         }); 
  18.  
  19.         this.graph = new Graph(this.keys.length); 
  20.         Arrays.stream(text.split("\n")).forEach(line -> { 
  21.             String[] split = line.split(","); 
  22.             int v = this.map.get(split[0]); 
  23.             for (int i = 1; i < split.length; i++) { 
  24.                 this.graph.addEdge(v, this.map.get(split[i])); 
  25.             } 
  26.         }); 
  27.          
  28.     } 
  29.  
  30.     public boolean contains(String key) { 
  31.         return map.contains(key); 
  32.     } 
  33.  
  34.     public int index(String key) { 
  35.         return map.get(key); 
  36.     } 
  37.  
  38.     public String name(int index) { 
  39.         return this.keys[index]; 
  40.     } 
  41.  
  42.     public Graph graph() { 
  43.         return this.graph; 
  44.     } 
  45.  
  46.     public static void main(String[] args) { 
  47.         System.out.println(Arrays.toString("323\n2323".split("\n"))); 
  48.     } 

 

文中所有源碼已放入到了github倉庫:https://github.com/silently9527/JavaCore

 

責任編輯:武曉燕 來源: 貝塔學JAVA
相關推薦

2011-05-17 13:58:37

最短路徑

2021-04-28 07:59:21

深度優先搜索

2021-08-26 17:36:42

Floyd算法數據結構

2013-04-23 09:31:52

SQL Server

2021-04-19 09:08:19

無向圖數據結構

2011-12-19 12:39:37

Java

2021-03-10 09:50:15

算法Dijkstra短路問題

2024-05-24 08:00:00

2011-04-11 16:32:28

路徑C++

2015-07-16 14:25:56

SDN網絡感知服務

2011-05-17 14:29:29

Dijkstra

2011-05-17 14:11:06

Dijkstra

2011-06-01 09:27:00

OSPF路由路由器

2025-02-26 05:00:00

DFS算法遞歸

2024-04-02 11:37:59

AGI網絡模型GAN

2015-12-07 17:07:36

SDN網絡流量

2020-09-16 12:23:37

TypeScript

2019-04-01 06:54:10

2021-09-08 10:32:29

微服務容器化Serverless

2014-03-26 09:04:42

算法Floyd最短算法
點贊
收藏

51CTO技術棧公眾號

自拍偷拍一区二区三区四区| 成人黄色小视频| 精品1区2区3区4区| 色屁屁一区二区| 欧美成人午夜视频| 老熟妇仑乱视频一区二区| 亚洲成人一二三区| 99久久久久国产精品| 一本一道综合狠狠老| 国产精品sss| 9999热视频| 日韩欧美激情| 国产精品视频免费| 日韩av免费在线观看| 女同性恋一区二区三区| 手机在线免费看av| 911精品美国片911久久久| 欧洲一区二区三区在线| 欧美激情第一页在线观看| 国产无套在线观看| 都市激情亚洲欧美| 亚洲线精品一区二区三区| 91免费版黄色| www青青草原| 网站一区二区| 一区二区三区成人| 成人久久18免费网站漫画| 欧美一级片在线视频| 91精品麻豆| 亚洲欧美日韩在线| 成人免费高清完整版在线观看| 污污视频网站在线免费观看| 国产精品久久久久77777丨| 国产免费观看久久| 国产精品久久久久久一区二区| 波多野结衣 在线| 婷婷激情一区| 国产精品天干天干在观线| 国产精品亚洲片夜色在线| a一级免费视频| 免费精品一区| 亚洲不卡一区二区三区| 精品国产一区二区三区麻豆免费观看完整版| 国产无遮挡又黄又爽又色| 日韩激情在线| 日韩欧美成人激情| 免费看国产曰批40分钟| 天天av综合网| 麻豆视频一区二区| 九九热最新视频//这里只有精品 | 在线看av的网址| 韩国欧美国产1区| 久久99视频精品| 亚洲 欧美 变态 另类 综合| 久久国产小视频| 色天天综合狠狠色| 中文字幕在线视频一区二区三区| 成人看片免费| av毛片久久久久**hd| 国产成人精品国内自产拍免费看| 国产又粗又猛又爽又黄的视频四季| 欧美在线导航| 欧美日韩大陆在线| 国产精品久久国产| 国产三级视频在线播放线观看| 国内精品自线一区二区三区视频| 国产精品普通话| 伊人网视频在线| 亚洲经典在线看| 正在播放欧美视频| 欧洲熟妇的性久久久久久| 亚洲播播91| 91成人免费网站| 天堂在线资源视频| av白虎一区| 中文字幕亚洲欧美在线不卡| 国产女人水真多18毛片18精品| 高潮毛片又色又爽免费| 亚洲精品推荐| 欧美一级免费大片| 国产欧美高清在线| 成人免费av电影| 亚洲电影在线免费观看| 亚洲一区二区在线观| 亚洲AV成人无码一二三区在线| 国产一区激情在线| 国产精品草莓在线免费观看| 精品成人免费视频| 中文精品电影| 亚洲人成自拍网站| 国产精品扒开腿做爽爽爽a片唱戏| 久久精品色播| 日韩美女一区二区三区四区| 亚洲成av人片在线观看无| 在线日本制服中文欧美| 色yeye香蕉凹凸一区二区av| 精品一区二区三区四| 天天影视天天精品| 国内精品视频一区| 青春草免费视频| 美女精品一区| 性欧美长视频免费观看不卡| 久久久国产精华液| 国产一区二区三区成人欧美日韩在线观看 | 91精品国产91久久久久福利| 无码黑人精品一区二区| 宅男噜噜噜66一区二区| 欧美激情精品久久久久久久变态| 国产黄色录像片| 一本色道久久精品| 91久久国产精品| 蜜桃av在线| 六月丁香综合| 成人在线免费观看视视频| 高清乱码毛片入口| 国产成人精品影视| 亚洲一区精品电影| 97人妻人人澡人人爽人人精品| 琪琪一区二区三区| 国产精品电影网| 亚洲精品人妻无码| 国产精品福利av| 永久免费精品视频网站| 91大神在线网站| 亚洲成人免费影院| 国内av一区二区| 9999精品视频| 亚洲欧洲免费视频| 久久精品无码人妻| 国产一区三区三区| 一区二区三区在线视频111| xx欧美视频| 欧美图片一区二区三区| 亚洲视频第二页| 久久99青青| 在线精品91av| 少妇高潮在线观看| 丝袜诱惑制服诱惑色一区在线观看 | 在线免费观看成年人视频| 噜噜噜狠狠夜夜躁精品仙踪林| 久久视频在线视频| 精品一级少妇久久久久久久| 韩国v欧美v亚洲v日本v| 图片区小说区区亚洲五月| 欧美三级黄网| 一区二区三区资源| 无码精品a∨在线观看中文| 日本免费久久| 亚洲精品综合精品自拍| 午夜国产福利视频| 激情国产一区| 国产精品久久一区二区三区| 九九热视频在线观看| 中文字幕日韩一区二区| 九九热免费在线观看| 国产精品玖玖玖在线资源| 欧美伦理91i| 超碰福利在线观看| 91偷拍与自偷拍精品| 亚洲激情图片| 丁香花在线影院| 91精品福利在线| 欧美三级视频网站| 激情久久五月| 激情小说综合网| 午夜影院在线播放| 91精品国产欧美一区二区18| 日本一区二区三区网站| 亚洲精品一区二区妖精| 91精品久久久久| 亚洲色图21p| 色琪琪一区二区三区亚洲区| 午夜免费欧美电影| 欧美综合亚洲图片综合区| 少妇av片在线观看| 极品少妇xxxx精品少妇偷拍| 色哺乳xxxxhd奶水米仓惠香| 亚洲wwwww| 精品国产一区二区三区av性色| 国产毛片久久久久久久| 日本网站在线观看一区二区三区| 伊人狠狠色丁香综合尤物| 国产精品欧美一区二区三区不卡| 亚洲乱码国产乱码精品精天堂| 永久免费无码av网站在线观看| 国产精品一区二区久久不卡 | 国产三级精品三级| 亚洲精品天堂成人片av在线播放| 91福利精品在线观看| 日韩视频欧美视频| 伊人网综合在线| 亚洲在线中文字幕| 少妇无套高潮一二三区| 国产福利一区二区三区在线视频| 国产二区视频在线播放| 欧美黄色录像片| 国产精品成人免费视频| a视频在线观看| 亚洲人成电影网站色xx| 国产黄色av片| 亚洲人成精品久久久久久 | 波多野结衣绝顶大高潮| 亚洲乱码日产精品bd| 日韩av.com| 亚洲毛片网站| 免费看污污视频| 日韩精品欧美| 欧美不卡三区| 欧美粗大gay| 欧美精品久久久久| www.亚洲欧美| 欧美影片第一页| 日韩aaaaaa| 99re热这里只有精品视频| 日本一道本久久| 91tv精品福利国产在线观看| 欧美一区少妇| 国产a亚洲精品| 4438全国亚洲精品在线观看视频| 亚欧洲精品视频| 日韩一二三区视频| 夜夜狠狠擅视频| 一区二区日韩av| www成人啪啪18软件| 久久夜色精品一区| 欧美激情精品久久久久久小说| 亚洲网站啪啪| 蜜桃久久精品乱码一区二区 | 日本精品视频| 国产精品免费观看在线| sis001欧美| 欧美一区二区三区图| 欧美14一18处毛片| 日韩欧美一二三区| 亚洲天堂网在线视频| 日本韩国视频一区二区| 国产精品久久久久久99| 国产亚洲精品精华液| 免费成人蒂法网站| 秋霞午夜av一区二区三区| 色综合久久久久无码专区| 国产探花一区| 亚洲a级在线观看| 日韩城人网站| 国产一区二区在线免费视频| www.一区| 成人免费网站在线| 亚洲精品第一| 成人乱人伦精品视频在线观看| 激情亚洲小说| 欧美精品久久久久久久免费观看| 黄色网址在线免费播放| 亚洲国产美女久久久久| 成年人视频免费| 在线视频综合导航| 国产成人a v| 欧美视频你懂的| 国产精品1234区| 亚洲成av人片观看| 成人午夜视频在线播放| 最新欧美精品一区二区三区| 乱老熟女一区二区三区| 亚洲欧美日韩一区| 69av.com| 精品免费在线观看| 一区二区三区四区免费| 26uuu欧美| 日本一区二区视频在线播放| 国产精品蜜臀在线观看| 欧美日韩色视频| 亚洲一区二区不卡免费| 91国产丝袜播放在线| 色综合一个色综合亚洲| 精品国产www| 午夜精品久久久久久久蜜桃app| 日韩av大片在线观看| 在线免费观看日韩欧美| 国产精品污视频| 亚洲第一精品福利| aaa国产视频| 国产一区二区三区久久| 国产精品免费视频xxxx| 国产精品一区免费在线| 国产一区二区高清不卡 | 亚洲国产欧美不卡在线观看 | 亚洲伊人影院| 国产高清在线不卡| 色999韩欧美国产综合俺来也| 99久久综合狠狠综合久久止| 伊甸园亚洲一区| 自拍偷拍一区二区三区| 国产亚洲在线观看| 999久久久精品视频| 99久久综合色| 欧日韩不卡视频| 午夜精品福利视频网站| 伊人22222| 亚洲精品国产综合久久| 色三级在线观看| 国产一区二区三区在线看| 无码精品视频一区二区三区| 中文字幕精品网| 丁香花在线电影小说观看| 国产精品视频公开费视频| 中文字幕日韩在线| 五月天色一区| 一本色道88久久加勒比精品| 一级片免费在线观看视频| 国产一区在线观看麻豆| 无码h肉动漫在线观看| 一区二区三区在线观看网站| 亚洲免费视频二区| 亚洲激情在线观看| 91福利国产在线观看菠萝蜜| 色综合天天综合网国产成人网| 欧美日韩美女| 国产伦精品一区二区三| 欧美一区二区三区久久精品| 熟妇熟女乱妇乱女网站| 亚洲欧美偷拍自拍| 成人在线观看黄| av电影天堂一区二区在线| 欧美成人国产精品高潮| 欧美日韩另类一区| 黄色免费在线播放| 97婷婷大伊香蕉精品视频| 日韩高清二区| 强开小嫩苞一区二区三区网站| 蜜臀精品久久久久久蜜臀| 嫩草视频免费在线观看| 国产香蕉久久精品综合网| 日本在线观看视频网站| 欧美不卡在线视频| 日批免费在线观看| 亚洲精品一区二区网址 | 北条麻妃久久精品| 日本一区二区三区视频在线| 成人网址在线观看| 欧美一区二区三区激情视频 | 天堂久久午夜av| 精品无人区一区二区三区| 亚洲激情精品| 黄色污在线观看| 精品久久久久久国产91| 三区在线观看| 亚洲一级黄色av| 成人做爰视频www网站小优视频| 久久人人九九| 亚洲91中文字幕无线码三区| 超碰在线播放91| 风流少妇一区二区| 日韩在线免费观看av| 欧美日韩一区二区免费在线观看| 无码精品在线观看| 欧美洲成人男女午夜视频| 天天综合91| 中文字幕一区二区三区最新| 精品系列免费在线观看| 中文字幕美女视频| 91精品国产色综合久久ai换脸| 黄色网页在线免费观看| 91久久大香伊蕉在人线| 国产精品hd| 黄大色黄女片18第一次| 中文字幕一区二区三区在线播放 | 日本精品福利视频| 国产ts人妖一区二区| 国产午夜精品无码一区二区| 日韩av一卡二卡| 成人在线观看免费网站| 亚洲a成v人在线观看| 精品电影一区| 蜜桃传媒一区二区亚洲av| 欧美性大战久久久久久久蜜臀 | 国产成人手机在线| 欧美一级电影在线| 日韩精品免费| 美女扒开腿免费视频| 中文字幕一区二区三区av| av加勒比在线| 97色在线播放视频| 北条麻妃国产九九九精品小说| 在线观看日本www| 香蕉av福利精品导航| 国产高清美女一级毛片久久| 91亚洲人电影| 性色一区二区| 丰满少妇一区二区三区| 欧美丝袜丝交足nylons| 欧洲性视频在线播放| 欧美亚洲一级二级| 激情综合色播激情啊| 亚洲精品国产精品乱码| 中文字幕亚洲精品| 懂色av一区二区| 少妇网站在线观看| 亚洲福利视频一区二区| 亚洲麻豆精品| 开心色怡人综合网站| 国产精品99久|