尋路算法(Java 實例代碼源碼包下載)

目錄

?

尋路算法

Java 實例代碼

src/runoob/graph/Path.java 文件代碼:


?

尋路算法

圖的尋路算法也可以通過深度優先遍歷 dfs 實現,尋找圖 graph 從起始 s 點到其他點的路徑,在上一小節的實現類中添加全局變量 from數組記錄路徑,from[i] 表示查找的路徑上i的上一個節點。

首先構造函數初始化尋路算法的初始條件,from = new int[G.V()] 和 from = new int[G.V()],并在循環中設置默認值,visited 數組全部為false,from 數組全部為 -1 值,后面對起始節點進行 dfs 的遞歸處理。

...
// 構造函數, 尋路算法, 尋找圖graph從s點到其他點的路徑
public Path(Graph graph, int s){
? ? // 算法初始化
? ? G = graph;
? ? assert s >= 0 && s < G.V();
? ? visited = new boolean[G.V()];
? ? from = new int[G.V()];
? ? for( int i = 0 ; i < G.V() ; i ++ ){
? ? ? ? visited[i] = false;
? ? ? ? from[i] = -1;
? ? }
? ? this.s = s;
? ? // 尋路算法
? ? dfs(s);
}
...

那么判斷 s 點到 w 點是否有路徑,只要查詢 visited 對應數組值即可。

...
boolean hasPath(int w){
? ? assert w >= 0 && w < G.V();
? ? return visited[w];
}
...

獲取 s 點到 w 點的具體路徑,我們用 path 方法來實現,先判斷是否連通,可調用 hasPath 方法,由構造函數可知只需通過 from 數組往上追溯就能找到所有的路徑。

...
Vector<Integer> path(int w){
? ? assert hasPath(w) ;
? ? Stack<Integer> s = new Stack<Integer>();
? ? // 通過from數組逆向查找到從s到w的路徑, 存放到棧中
? ? int p = w;
? ? while( p != -1 ){
? ? ? ? s.push(p);
? ? ? ? p = from[p];
? ? }
? ? // 從棧中依次取出元素, 獲得順序的從s到w的路徑
? ? Vector<Integer> res = new Vector<Integer>();
? ? while( !s.empty() )
? ? ? ? res.add( s.pop() );
? ? return res;
}
...

Java 實例代碼

源碼包下載:Download

src/runoob/graph/Path.java 文件代碼:

package runoob.graph;

import runoob.graph.read.Graph;

import java.util.Stack;
import java.util.Vector;

/**
?* 尋路
?*/
public class Path {
? ? // 圖的引用
? ? private Graph G;
? ? // 起始點
? ? private int s;
? ? // 記錄dfs的過程中節點是否被訪問
? ? private boolean[] visited;
? ? // 記錄路徑, from[i]表示查找的路徑上i的上一個節點
? ? private int[] from;

? ? // 圖的深度優先遍歷
? ? private void dfs( int v ){
? ? ? ? visited[v] = true;
? ? ? ? for( int i : G.adj(v) )
? ? ? ? ? ? if( !visited[i] ){
? ? ? ? ? ? ? ? from[i] = v;
? ? ? ? ? ? ? ? dfs(i);
? ? ? ? ? ? }
? ? }

? ? // 構造函數, 尋路算法, 尋找圖graph從s點到其他點的路徑
? ? public Path(Graph graph, int s){
? ? ? ? // 算法初始化
? ? ? ? G = graph;
? ? ? ? assert s >= 0 && s < G.V();
? ? ? ? visited = new boolean[G.V()];
? ? ? ? from = new int[G.V()];
? ? ? ? for( int i = 0 ; i < G.V() ; i ++ ){
? ? ? ? ? ? visited[i] = false;
? ? ? ? ? ? from[i] = -1;
? ? ? ? }
? ? ? ? this.s = s;
? ? ? ? // 尋路算法
? ? ? ? dfs(s);
? ? }

? ? // 查詢從s點到w點是否有路徑
? ? boolean hasPath(int w){
? ? ? ? assert w >= 0 && w < G.V();
? ? ? ? return visited[w];
? ? }

? ? // 查詢從s點到w點的路徑, 存放在vec中
? ? Vector<Integer> path(int w){

? ? ? ? assert hasPath(w) ;

? ? ? ? Stack<Integer> s = new Stack<Integer>();
? ? ? ? // 通過from數組逆向查找到從s到w的路徑, 存放到棧中
? ? ? ? int p = w;
? ? ? ? while( p != -1 ){
? ? ? ? ? ? s.push(p);
? ? ? ? ? ? p = from[p];
? ? ? ? }

? ? ? ? // 從棧中依次取出元素, 獲得順序的從s到w的路徑
? ? ? ? Vector<Integer> res = new Vector<Integer>();
? ? ? ? while( !s.empty() )
? ? ? ? ? ? res.add( s.pop() );

? ? ? ? return res;
? ? }

? ? // 打印出從s點到w點的路徑
? ? void showPath(int w){

? ? ? ? assert hasPath(w) ;

? ? ? ? Vector<Integer> vec = path(w);
? ? ? ? for( int i = 0 ; i < vec.size() ; i ++ ){
? ? ? ? ? ? System.out.print(vec.elementAt(i));
? ? ? ? ? ? if( i == vec.size() - 1 )
? ? ? ? ? ? ? ? System.out.println();
? ? ? ? ? ? else
? ? ? ? ? ? ? ? System.out.print(" -> ");
? ? ? ? }
? ? }
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/43031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/43031.shtml
英文地址,請注明出處:http://en.pswp.cn/news/43031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

8月18日,每日信息差

1、中國空間站收獲階段性應用成果。?截至目前&#xff0c;空間站已安排在軌實施了110個空間科學研究與應用項目&#xff0c;涉及空間生命科學與人體研究、微重力物理和空間新技術領域&#xff0c;獲得原始實驗數據近100TB&#xff0c;下行了近300個實驗樣品&#xff0c;部分項…

改進YOLO系列:3.添加SOCA注意力機制

添加SOCA注意力機制 1. SOCA注意力機制論文2. SOCA注意力機制原理3. SOCA注意力機制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. SOCA注意力機制論文 暫未找到 2. SOCA注意力機制原理 3. SOCA注意力機制的配置 3.1common.py配置 ./models/common.p…

Linux 網絡發包流程

哈嘍大家好&#xff0c;我是咸魚 之前咸魚在《Linux 網絡收包流程》一文中介紹了 Linux 是如何實現網絡接收數據包的 簡單回顧一下&#xff1a; 數據到達網卡之后&#xff0c;網卡通過 DMA 將數據放到內存分配好的一塊 ring buffer 中&#xff0c;然后觸發硬中斷CPU 收到硬中…

Lnton羚通關于Optimization在【PyTorch】中的基礎知識

OPTIMIZING MODEL PARAMETERS &#xff08;模型參數優化&#xff09; 現在我們有了模型和數據&#xff0c;是時候通過優化數據上的參數來訓練了&#xff0c;驗證和測試我們的模型。訓練一個模型是一個迭代的過程&#xff0c;在每次迭代中&#xff0c;模型會對輸出進行猜測&…

python3 0基礎學習----數據結構(基礎+練習)

python 0基礎學習筆記之數據結構 &#x1f4da; 幾種常見數據結構列表 &#xff08;List&#xff09;1. 定義2. 實例&#xff1a;3. 列表中常用方法.append(要添加內容) 向列表末尾添加數據.extend(列表) 將可迭代對象逐個添加到列表中.insert(索引&#xff0c;插入內容) 向指定…

8.17校招 內推 面經

綠泡泡&#xff1a; neituijunsir 交流裙&#xff0c;內推/實習/校招匯總表格 1、校招 | 騰訊2024校園招聘全面啟動(內推) 校招 | 騰訊2024校園招聘全面啟動(內推) 2、校招 | 大華股份2024屆全球校園招聘正式啟動(內推) 校招 | 大華股份2024屆全球校園招聘正式啟動(內推) …

國家一帶一路和萬眾創業創新的方針政策指引下,Live Market探索跨境產業的創新發展

現代社會&#xff0c;全球經濟互聯互通&#xff0c;跨境產業也因此而崛起。為了推動跨境產業的創新發展&#xff0c;中國政府提出了“一帶一路”和“萬眾創業、萬眾創新”的方針政策&#xff0c;旨在促進全球經濟的互聯互通和創新發展。在這個大環境下&#xff0c;Live Market積…

Mariadb高可用MHA

本節主要學習了Mariadb高可用MHA的概述&#xff0c;案例如何構建MHA 提示&#xff1a;以下是本篇文章正文內容&#xff0c;下面案例可供參考 一、概述 1、概念 MHA&#xff08;MasterHigh Availability&#xff09;是一套優秀的MySQL高可用環境下故障切換和主從復制的軟件。…

合宙Air724UG LuatOS-Air LVGL API--簡介

為何是 LVGL LVGL 是一個開源的圖形庫&#xff0c;它提供了創建嵌入式 GUI 所需的一切&#xff0c;具有易于使用的圖形元素、漂亮的視覺效果和低內存占用的特點。 LVGL特點&#xff1a; 強大的 控件 &#xff1a;按鈕、圖表、列表、滑動條、圖像等 高級圖形引擎&#xff1a;動…

BIO、NIO和AIO

一.引言 何為IO 涉及計算機核心(CPU和內存)與其他設備間數據遷移的過程&#xff0c;就是I/O。數據輸入到計算機內存的過程即輸入&#xff0c;反之輸出到外部存儲&#xff08;比如數據庫&#xff0c;文件&#xff0c;遠程主機&#xff09;的過程即輸出。 I/O 描述了計算機系統…

插入排序優化——超越歸并排序的超級算法

插入排序及優化 插入排序算法算法講解數據模擬代碼 優化思路一、二分查找二、copy函數 優化后代碼算法的用途題目&#xff1a;數星星&#xff08;POJ2352 star&#xff09;輸入輸出格式輸入格式&#xff1a;輸出格式 輸入輸出樣例輸入樣例輸出樣例 題目講解步驟如下AC 代碼 插入…

HIVE SQL實現分組字符串拼接concat

在Mysql中可以通過group_concat()函數實現分組字符串拼接&#xff0c;在HIVE SQL中可以使用concat_ws()collect_set()/collect_list()函數實現相同的效果。 實例&#xff1a; abc2014B92015A82014A102015B72014B6 1.concat_wscollect_list 非去重拼接 select a ,concat_ws(-…

Linux系統中基于NGINX的代理緩存配置指南

作為一名專業的爬蟲程序員&#xff0c;你一定知道代理緩存在加速網站響應速度方面的重要性。而使用NGINX作為代理緩存服務器&#xff0c;能夠極大地提高性能和效率。本文將為你分享Linux系統中基于NGINX的代理緩存配置指南&#xff0c;提供實用的解決方案&#xff0c;助你解決在…

C語言刷題訓練DAY.8

1.計算單位階躍函數 解題思路&#xff1a; 這個非常簡單&#xff0c;只需要if else語句即可完成 解題代碼&#xff1a; #include <stdio.h>int main() {int t 0;while(scanf("%d",&t)!EOF){if (t > 0)printf("1\n");else if (t < 0)pr…

大模型基礎02:GPT家族與提示學習

大模型基礎&#xff1a;GPT 家族與提示學習 從 GPT-1 到 GPT-3.5 GPT(Generative Pre-trained Transformer)是 Google 于2018年提出的一種基于 Transformer 的預訓練語言模型。它標志著自然語言處理領域從 RNN 時代進入 Transformer 時代。GPT 的發展歷史和技術特點如下: GP…

【校招VIP】java語言類和對象之map、set集合

考點介紹&#xff1a; map、set集合相關內容是校招面試的高頻考點之一。 map和set是一種專門用來進行搜索的容器或者數據結構&#xff0c;其搜索效率與其具體的實例化子類有關系。 『java語言類和對象之map、set集合』相關題目及解析內容可點擊文章末尾鏈接查看&#xff01; …

深入了解Maven(一)

目錄 一.Maven介紹與功能 二.依賴管理 1.依賴的配置 2.依賴的傳遞性 3.排除依賴 4.依賴的作用范圍 5.依賴的生命周期 一.Maven介紹與功能 maven是一個項目管理和構建工具&#xff0c;是基于對象模型POM實現。 Maven的作用&#xff1a; 便捷的依賴管理&#xff1a;使用…

springboot 使用zookeeper實現分布式隊列

一.添加ZooKeeper依賴&#xff1a;在pom.xml文件中添加ZooKeeper客戶端的依賴項。例如&#xff0c;可以使用Apache Curator作為ZooKeeper客戶端庫&#xff1a; <dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</…

【java安全】Log4j反序列化漏洞

文章目錄 【java安全】Log4j反序列化漏洞關于Apache Log4j漏洞成因CVE-2017-5645漏洞版本復現環境漏洞復現漏洞分析 CVE-2019-17571漏洞版本漏洞復現漏洞分析 參考 【java安全】Log4j反序列化漏洞 關于Apache Log4j Log4j是Apache的開源項目&#xff0c;可以實現對System.out…

英語——構詞法

按照語言一定的規律創造新詞的方法就叫作構詞法。英語中常見的構詞法包括六種:合成法、派生法、轉化法、混合法、截短法和首尾字母結合法。其中后三種將在第四節“縮寫和簡寫”中進行講解。 第一節 合成法 英語構詞法中把兩個單詞連在一起合成一個新詞,前一個詞修飾或限定后…