亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java實現利用廣度優先遍歷(BFS)計算最短路徑的方法

2019-11-26 15:12:48
字體:
來源:轉載
供稿:網友

本文實例講述了Java實現利用廣度優先遍歷(BFS)計算最短路徑的方法。分享給大家供大家參考。具體分析如下:

我們用字符串代表圖的頂點(vertax),來模擬學校中Classroom, Square, Toilet, Canteen, South Gate, North Gate幾個地點,然后計算任意兩點之間的最短路徑。

如下圖所示:

如,我想從North Gate去Canteen, 程序的輸出結果應為:

BFS: From [North Gate] to [Canteen]:North GateSquareCanteen

首先定義一個算法接口Algorithm:

public interface Algorithm {  /**   * 執行算法   */  void perform(Graph g, String sourceVertex);  /**   * 得到路徑   */  Map<String, String> getPath();}

然后,定義圖:

/** * (無向)圖 */public class Graph {  // 圖的起點  private String firstVertax;  // 鄰接表  private Map<String, List<String>> adj = new HashMap<>();  // 遍歷算法  private Algorithm algorithm;  public Graph(Algorithm algorithm) {    this.algorithm = algorithm;  }  /**   * 執行算法   */  public void done() {    algorithm.perform(this, firstVertax);  }  /**   * 得到從起點到{@code vertex}點的最短路徑   * @param vertex   * @return   */  public Stack<String> findPathTo(String vertex) {    Stack<String> stack = new Stack<>();    stack.add(vertex);    Map<String, String> path = algorithm.getPath();    for (String location = path.get(vertex) ; false == location.equals(firstVertax) ; location = path.get(location)) {      stack.push(location);    }    stack.push(firstVertax);    return stack;  }  /**   * 添加一條邊   */  public void addEdge(String fromVertex, String toVertex) {    if (firstVertax == null) {      firstVertax = fromVertex;    }    adj.get(fromVertex).add(toVertex);    adj.get(toVertex).add(fromVertex);  }  /**   * 添加一個頂點   */  public void addVertex(String vertex) {    adj.put(vertex, new ArrayList<>());  }  public Map<String, List<String>> getAdj() {    return adj;  }}

這里我們使用策略設計模式,將算法與Graph類分離,通過在構造Graph對象時傳入一個Algorithm接口的實現來為Graph選擇遍歷算法。

public Graph(Algorithm algorithm) {    this.algorithm = algorithm;  }

無向圖的存儲結構為鄰接表,這里用一個Map表示鄰接表,map的key是學校地點(String),value是一個與該地點相連通的地點表(List<String>)。

// 鄰接表  private Map<String, List<String>> adj = new HashMap<>();

然后,編寫Algorithm接口的BFS實現:

/** * 封裝BFS算法 */public class BroadFristSearchAlgorithm implements Algorithm {  // 保存已經訪問過的地點  private List<String> visitedVertex;  // 保存最短路徑  private Map<String, String> path;  @Override  public void perform(Graph g, String sourceVertex) {    if (null == visitedVertex) {      visitedVertex = new ArrayList<>();    }    if (null == path) {      path = new HashMap<>();    }    BFS(g, sourceVertex);  }  @Override  public Map<String, String> getPath() {    return path;  }  private void BFS(Graph g, String sourceVertex) {    Queue<String> queue = new LinkedList<>();    // 標記起點    visitedVertex.add(sourceVertex);    // 起點入列    queue.add(sourceVertex);    while (false == queue.isEmpty()) {      String ver = queue.poll();      List<String> toBeVisitedVertex = g.getAdj().get(ver);      for (String v : toBeVisitedVertex) {        if (false == visitedVertex.contains(v)) {          visitedVertex.add(v);          path.put(v, ver);          queue.add(v);        }      }    }  }}

其中,path是Map類型,意為從 value 到 key 的一條路徑。

BFS算法描述:

1. 將起點標記為已訪問并放入隊列。
2. 從隊列中取出一個頂點,得到與該頂點相通的所有頂點。
3. 遍歷這些頂點,先判斷頂點是否已被訪問過,如果否,標記該點為已訪問,記錄當前路徑,并將當前頂點入列。
4. 重復2、3,直到隊列為空。

測試用例:

String[] vertex = {"North Gate", "South Gate", "Classroom", "Square", "Toilet", "Canteen"};  Edge[] edges = {      new Edge("North Gate", "Classroom"),      new Edge("North Gate", "Square"),      new Edge("Classroom", "Toilet"),      new Edge("Square", "Toilet"),      new Edge("Square", "Canteen"),      new Edge("Toilet", "South Gate"),      new Edge("Toilet", "South Gate"),  };@Test  public void testBFS() {    Graph g = new Graph(new BroadFristSearchAlgorithm());    addVertex(g);    addEdge(g);    g.done();    Stack<String> result = g.findPathTo("Canteen");    System.out.println("BFS: From [North Gate] to [Canteen]:");    while (!result.isEmpty()) {      System.out.println(result.pop());    }  }

希望本文所述對大家的java程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色婷婷综合久久久久中文字幕1| 亚洲缚视频在线观看| 久久精品电影网| 国产精品精品视频一区二区三区| 亚洲电影免费观看高清完整版在线观看| 国产精品一区二区av影院萌芽| 日韩一中文字幕| 成人乱人伦精品视频在线观看| 91九色国产社区在线观看| 最新日韩中文字幕| 91日本在线观看| 久久精品91久久香蕉加勒比| 久热精品视频在线观看一区| 久久综合久久美利坚合众国| 日韩美女中文字幕| 日韩免费在线播放| 欧美亚洲成人免费| 伊人久久大香线蕉av一区二区| 久久久久一本一区二区青青蜜月| 精品日本高清在线播放| 日韩免费中文字幕| 欧美裸体视频网站| 2019中文字幕全在线观看| 亚洲高清福利视频| 国产精品精品视频| 日韩欧美精品网站| 欧美日韩国产中文精品字幕自在自线| 日日噜噜噜夜夜爽亚洲精品| 高潮白浆女日韩av免费看| 欧美自拍视频在线| 国产精品一区二区三区毛片淫片| 亚洲一区二区三区777| 欧美裸体男粗大视频在线观看| 久久人人爽亚洲精品天堂| 久久国产色av| 全亚洲最色的网站在线观看| 久久精品中文字幕| 国产精品扒开腿做爽爽爽的视频| 91情侣偷在线精品国产| 亚洲性无码av在线| 欧美成人一二三| 久久久噜噜噜久久久| 精品国内自产拍在线观看| 欧美视频13p| 国产精品成av人在线视午夜片| 亚洲老头同性xxxxx| 久久久久久香蕉网| 中文字幕视频一区二区在线有码| 欧美www视频在线观看| 久久久国产在线视频| 亚洲男人天堂2019| 黑人巨大精品欧美一区二区| 欧美大学生性色视频| 亚洲一区中文字幕在线观看| 日本精品一区二区三区在线播放视频| 国产成人精品久久亚洲高清不卡| 亚洲午夜精品久久久久久久久久久久| 欧美另类第一页| 精品国内产的精品视频在线观看| 久久久久亚洲精品成人网小说| 亚洲已满18点击进入在线看片| 国产乱肥老妇国产一区二| 亚洲精品丝袜日韩| 一级做a爰片久久毛片美女图片| 色综合久久天天综线观看| 色狠狠久久aa北条麻妃| 久久九九国产精品怡红院| 欧美性猛交xxxx乱大交极品| 亚洲综合精品伊人久久| 中文日韩电影网站| 欧美精品videosex性欧美| 久久久精品美女| 91牛牛免费视频| 中文字幕在线成人| 97在线精品国自产拍中文| 欧美一级片久久久久久久| 久久久久久国产精品美女| 成人黄色大片在线免费观看| 国产精品久久久久久婷婷天堂| 亚洲 日韩 国产第一| 日本精品久久久久影院| 亚洲欧美另类人妖| 欧洲成人在线观看| 国产精品自产拍高潮在线观看| 色青青草原桃花久久综合| 亚洲国产精品久久久久秋霞不卡| 亚洲成人精品av| 57pao国产成人免费| 日本三级韩国三级久久| 69视频在线免费观看| 久久久久久97| 91美女片黄在线观| 中文字幕欧美精品在线| 日本欧美国产在线| 视频在线观看一区二区| 亚洲韩国日本中文字幕| 国产欧美一区二区三区在线| 伊人久久久久久久久久久| 亚洲高清免费观看高清完整版| 欧美性猛交xxxx偷拍洗澡| 亚洲女人被黑人巨大进入al| 国产欧美亚洲精品| 日韩在线不卡视频| 亚洲黄色在线观看| 全亚洲最色的网站在线观看| 欧美黑人一级爽快片淫片高清| 久久视频在线免费观看| 91高清免费在线观看| 日韩在线观看网站| 久久久久久久久久av| 91在线无精精品一区二区| 亚洲аv电影天堂网| 97在线免费观看| 爽爽爽爽爽爽爽成人免费观看| 欧美一区二区三区图| 亚洲女同精品视频| 欧美成人全部免费| 久久韩国免费视频| 日韩亚洲欧美中文在线| 久久九九精品99国产精品| 欧美日韩国产成人| 欧美在线激情视频| 日本精品久久中文字幕佐佐木| 色综合久久中文字幕综合网小说| 自拍亚洲一区欧美另类| 欧美风情在线观看| 伊人久久男人天堂| 人人爽久久涩噜噜噜网站| 欧美丝袜一区二区| 欧美成人午夜影院| 成人欧美在线视频| 欧美日韩ab片| 日韩有码在线电影| 成人午夜一级二级三级| 热久久这里只有精品| 精品magnet| 国产精品网站视频| 国产精品久久久久av| 九九热在线精品视频| 911国产网站尤物在线观看| 成人a在线视频| 有码中文亚洲精品| 奇米一区二区三区四区久久| 久久天天躁狠狠躁夜夜躁2014| 欧美一级片一区| 91在线免费视频| 精品国产一区二区三区久久狼5月| 日本一区二三区好的精华液| 国产精品视频在线观看| 欧美日韩性生活视频| 俺去了亚洲欧美日韩| 久久久久久久激情视频| 久久久电影免费观看完整版| 欧美成人精品激情在线观看| 97色在线观看免费视频| 亚洲午夜色婷婷在线| 最近中文字幕日韩精品| 韩曰欧美视频免费观看| 欧美激情视频网| 亚洲欧美激情另类校园| 欧美另类极品videosbest最新版本| 精品一区二区三区四区在线| 91日本在线视频| 最好看的2019的中文字幕视频|