代碼隨想錄Day74(圖論Part10)

94. 城市間貨物運輸| (Bellman_ford隊列優化版 / SPFA)

題目:94. 城市間貨物運輸 I (kamacoder.com)

思路:

Bellman_ford 算法 每次都是對所有邊進行松弛,其實是多做了一些無用功。

只需要對 上一次松弛的時候更新過的節點作為出發節點所連接的邊 進行松弛就夠了

因此,關鍵在于記錄上次松弛更新過的節點,用隊列來記錄。

答案
import java.util.*;class Edge {int to;  // 鏈接的節點int val; // 邊的權重Edge(int t, int w) {to = t;val = w;}
}public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();  // 頂點數int m = scanner.nextInt();  // 邊數List<List<Edge>> graph = new ArrayList<>();for (int i = 0; i <= n; i++) {graph.add(new ArrayList<>());}// 將所有邊保存起來for (int i = 0; i < m; i++) {int p1 = scanner.nextInt();int p2 = scanner.nextInt();int val = scanner.nextInt();// p1 指向 p2,權值為 valgraph.get(p1).add(new Edge(p2, val));}int start = 1;  // 起點int end = n;    // 終點int[] minDist = new int[n + 1];Arrays.fill(minDist, Integer.MAX_VALUE);minDist[start] = 0;Queue<Integer> queue = new LinkedList<>();queue.offer(start); // 隊列里放入起點while (!queue.isEmpty()) {int node = queue.poll();for (Edge edge : graph.get(node)) {int from = node;int to = edge.to;int value = edge.val;if (minDist[to] > minDist[from] + value) { // 開始松弛minDist[to] = minDist[from] + value;queue.offer(to);}}}if (minDist[end] == Integer.MAX_VALUE) {System.out.println("unconnected"); // 不能到達終點} else {System.out.println(minDist[end]); // 到達終點最短路徑}scanner.close();}
}
小結

鄰接表存儲,方便找到?上一次松弛時,更新過的節點作為出發節點所連接的邊

List<List<Edge>> graph = new ArrayList<>();
for (int i = 0; i <= n; i++) {graph.add(new ArrayList<>());
}

?使用LinkedList實現Queue,不斷從中 poll 出節點node,操作?node?的?edge,將 node.to 加入到隊列中

Queue<Integer> queue = new LinkedList<>();
queue.offer(start); // 隊列里放入起點while (!queue.isEmpty()) {int node = queue.poll();for (Edge edge : graph.get(node)) {int from = node;int to = edge.to;int value = edge.val;if (minDist[to] > minDist[from] + value) { // 開始松弛minDist[to] = minDist[from] + value;queue.offer(to);}}
}

95.城市間貨物運輸|| (Bellman_ford判斷負權回路)

題目:95. 城市間貨物運輸 II (kamacoder.com)

思路:出現負權回路,按照之前的思路,會一直循環回路,使得成本不斷減小,因此核心思路是,在Bellman_ford標準版基礎上,再松弛一次,看結果是否變化

SPFA(Bellman_ford優化版),則是看節點加入隊列次數是否超過n-1次

答案
import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();  // 頂點數int m = scanner.nextInt();  // 邊數List<int[]> edges = new ArrayList<>();// 將所有邊保存起來for (int i = 0; i < m; i++) {int p1 = scanner.nextInt();int p2 = scanner.nextInt();int val = scanner.nextInt();edges.add(new int[]{p1, p2, val});}int start = 1;  // 起點int end = n;    // 終點int[] minDist = new int[n + 1];Arrays.fill(minDist, Integer.MAX_VALUE);minDist[start] = 0;boolean flag = false;// 對所有邊松弛 n 次,最后一次判斷負權回路for (int i = 1; i <= n; i++) {for (int[] edge : edges) {int from = edge[0];int to = edge[1];int price = edge[2];if (i < n) {if (minDist[from] != Integer.MAX_VALUE && minDist[to] > minDist[from] + price) {minDist[to] = minDist[from] + price;}} else { // 多加一次松弛判斷負權回路if (minDist[from] != Integer.MAX_VALUE && minDist[to] > minDist[from] + price) {flag = true;}}}}if (flag) {System.out.println("circle");} else if (minDist[end] == Integer.MAX_VALUE) {System.out.println("unconnected");} else {System.out.println(minDist[end]);}scanner.close();}
}

95.城市間貨物運輸|||(Bellman_ford單源有限最短路徑)

題目:96. 城市間貨物運輸 III (kamacoder.com)

思路:關鍵是在于,每次松弛要基于上一次松弛的結果

答案
import java.util.*;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();  // 頂點數int m = scanner.nextInt();  // 邊數List<int[]> edges = new ArrayList<>();// 將所有邊保存起來for (int i = 0; i < m; i++) {int p1 = scanner.nextInt();int p2 = scanner.nextInt();int val = scanner.nextInt();edges.add(new int[]{p1, p2, val});}int src = scanner.nextInt();  // 起點int dst = scanner.nextInt();  // 終點int k = scanner.nextInt();    // 最大邊數int[] minDist = new int[n + 1];Arrays.fill(minDist, Integer.MAX_VALUE);minDist[src] = 0;int[] minDistCopy = new int[n + 1];// 進行 k+1 次松弛操作for (int i = 1; i <= k + 1; i++) {System.arraycopy(minDist, 0, minDistCopy, 0, minDist.length); // 獲取上一次計算的結果for (int[] edge : edges) {int from = edge[0];int to = edge[1];int price = edge[2];// 注意使用 minDistCopy 來計算 minDistif (minDistCopy[from] != Integer.MAX_VALUE && minDist[to] > minDistCopy[from] + price) {minDist[to] = minDistCopy[from] + price;}}}if (minDist[dst] == Integer.MAX_VALUE) {System.out.println("unreachable"); // 不能到達終點} else {System.out.println(minDist[dst]); // 到達終點最短路徑}scanner.close();}
}
小結

更新用的是minDist,判斷用的是minDistCopy

if (minDistCopy[from] != Integer.MAX_VALUE && minDist[to] > minDistCopy[from] + price) {minDist[to] = minDistCopy[from] + price;
}

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

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

相關文章

p6spy 組件打印完整的 SQL 語句、執行耗時

一、前言 我們來配置一下 Mybatis Plus 打印 SQL 功能&#xff08;包括執行耗時&#xff09;&#xff0c;一方面可以了解到每個操作都具體執行的什么 SQL 語句&#xff0c; 另一方面通過打印執行耗時&#xff0c;也可以提前發現一些慢 SQL&#xff0c;提前做好優化&#xff0c…

layui中添加上下文提示彈窗

<p context-tip"自定義上下文提示信息">段落內容...</p> <div context-tip"自定義上下文提示信息">div內容...</div>// 懸浮提示 $("body").on("mouseenter", "*[context-tip]", function () {v…

操作系統僵尸進程、CFS、上下文切換

進程 Linux的進程調度 CFS 完全公平調度算法 權重和nice值 權重&#xff1a;權重越大&#xff0c;分配的時間比例越大&#xff0c;就相當于進程的優先級越高。 進程的時間 C P U 總時間 ? 進程的權重 / 就緒隊列所有進程權重之和 進程的時間 CPU總時間 * 進程的權重/就緒…

電腦鼠標一直轉圈圈怎么處理?對癥下藥,分享6種方法

在使用電腦的過程中&#xff0c;鼠標一直轉圈圈是一個常見且令人困擾的問題。這種情況通常意味著系統正在處理某些任務&#xff0c;但如果持續時間過長&#xff0c;可能表明系統存在性能問題或錯誤。本文將詳細探討鼠標一直轉圈圈的常見原因及其解決方法。 摘要 電腦鼠標一直轉…

概述:監督學習(分類,回歸)與無監督學習(聚類)

目錄&#xff1a; 一、監督學習&#xff1a;1.什么是監督學習&#xff1a;2.監督學習類型: 二、無監督學習1.什么是無監督學習&#xff1a;2.無監督學習類型: 一、監督學習&#xff1a; 1.什么是監督學習&#xff1a; 當前創造市場價值的機器學習中99%都是監督學習。監督學習…

Django實現部門管理功能

在這篇文章中,我們將介紹如何使用Django框架實現一個簡單的部門管理功能。這個功能包括部門列表展示、添加新部門、編輯和刪除部門等操作。 1. 項目設置 首先,確保你已經安裝了Django并創建了一個新的Django項目。在項目中,我們需要創建一個名為??app01??的應用。 2.…

【前端項目筆記】8 訂單管理

訂單管理 效果展示&#xff1a; 在開發功能之前先創建分支order cls 清屏 git branch 查看所有分支&#xff08;*代表當前分支&#xff09; git checkout -b order 新建分支order git push -u origin order 將本地的當前分支提交到云端倉庫origin中命名為order 通過路由方式…

JAVA 和Python對比

JAVA 和Python對比 1 . 數據類型 python Int&#xff0c;float&#xff0c;complex numbers 都沒有定義到底占用多少個字節空間。都是沒有取值范圍&#xff0c;也沒有無符號的情況。 JAVA JAVA 有基礎數據類型&#xff0c;都有確定占多少個字節 2. 全局變量 python 類似…

基于精益轉型打造醫療電子運營新模式

為了保持競爭優勢并滿足日益增長的客戶需求&#xff0c;許多企業開始探索精益轉型之路&#xff0c;以打造醫療電子運營的新模式。本文&#xff0c;深圳天行健精益管理咨詢公司將從精益轉型的概念、實施策略以及面臨的挑戰等方面&#xff0c;深入探討如何通過精益轉型實現醫療電…

面試問題C++

當你將一個無符號整型(unsigned integer)轉換為一個有符號整型(signed integer)時,具體的值取決于原始無符號整型的值以及目標有符號整型的大小。 轉換規則: 如果無符號整型的值在有符號整型的可表示范圍內(即它小于等于INT_MAX),則轉換后的值將保持不變。如果無符號…

【數據結構】(C語言):堆(二叉樹的應用)

堆&#xff1a; 此處堆為二叉樹的應用&#xff0c;不是計算機中用于管理動態內存的堆。形狀是完全二叉樹。堆分兩種&#xff1a;最大堆&#xff0c;最小堆。最大堆&#xff1a;每個節點比子樹所有節點的數值都大&#xff0c;根節點為最大值。最小堆&#xff1a;每個節點比子樹…

python-opencv多態模板匹配簡單代碼實現

在我實驗過程中發現&#xff0c;這種模板匹配如果不做任何處理只對原有圖像進行匹配的話&#xff0c;好像效果很瓜 貌似是模板是1 那就只能檢測出正常形態下的1&#xff0c;變大或者是 l 都不一定檢測到&#xff0c; 也就是說&#xff0c;只能檢測和模板圖片大小尺寸顏色類別…

docker 安裝 禪道

docker pull hub.zentao.net/app/zentao:20.1.1 sudo docker network create --subnet172.172.172.0/24 zentaonet 使用 8087端口號訪問 使用禪道mysql 映射到3307 sudo docker run \ --name zentao2 \ -p 8087:80 \ -p 3307:3306 \ --networkzentaonet \ --ip 172.172.172.…

電腦錄制視頻的軟件,電腦錄制,4款免費軟件推薦

在數字化時代&#xff0c;電腦錄制視頻的軟件已成為我們日常生活和工作中的得力助手&#xff0c;這些軟件可以幫助我們輕松捕獲到屏幕上的精彩瞬間。但同時市面上的錄制視頻軟件也層出不窮&#xff0c;讓人不知該如何選擇。到底怎樣才能選擇到一款適合自己的錄屏軟件呢&#xf…

【SpringBoot3學習 | 第2篇】SpringBoot3整合+SpringBoot3項目打包運行

文章目錄 一. SpringBoot3 整合 SpringMVC1.1 配置靜態資源位置1.2 自定義攔截器&#xff08;SpringMVC配置&#xff09; 二. SpringBoot3 整合 Druid 數據源三. SpringBoot3 整合 Mybatis3.1 Mybatis整合3.2 聲明式事務整合配置3.3 AOP整合配置 四. SpringBoot3 項目打包和運行…

k8s-第二節-常用操作

k8s命令行常用操作 k8s命令行 操作對象時都要前面聲明操作對象類型 kubectl get kubectl describe kubectl delete kubectl edit kubectl logs kubectl exec kubectl port-forward 端口轉發將pod 端口映射出來 kubectl cp 本地文件路徑:容器文件路徑 kubectl apply …

【JS場景題】判斷一個元素是否在可視區域內有哪些方法?

方法一、通過元素的位置信息和滾動條滾動的高度來判斷 前置知識 clientWidth: 元素的內容區域寬度加上左右內邊距寬度。offsetTop: 元素的上外邊框至包含元素的上內邊框之間的像素距離。document.documentElement.clientHeight&#xff1a; 獲取視口高度&#xff08;不包含滾動…

《Attention Is All You Need》解讀

一、簡介 “Attention Is All You Need” 是一篇由Ashish Vaswani等人在2017年發表的論文&#xff0c;它在自然語言處理領域引入了一種新的架構——Transformer。這個架構現在被廣泛應用于各種任務&#xff0c;如機器翻譯、文本摘要、問答系統等。Transformer模型的核心是“自…

小學vr虛擬課堂教學課件開發打造信息化教學典范

在信息技術的浪潮中&#xff0c;VR技術正以其獨特的魅力與課堂教學深度融合&#xff0c;引領著教育方式的創新與教學方法的變革。這一變革不僅推動了“以教促學”的傳統模式向“自主探索”的新型學習方式轉變&#xff0c;更為學生帶來了全新的學習體驗。 運用信息技術融合VR教學…

深度學習1

1.支持向量機Support Vector Machine&#xff08;SVM&#xff09;是一種對數據二分類的線性分類器&#xff0c;目的是尋找一個超平面對樣本進行分割&#xff0c;廣泛應用人像識別&#xff0c;手寫數字識別&#xff0c;生物信息識別。 二維空間分割界是一條直線&#xff0c;在三…