52、有邊數限制的最短路

有邊數限制的最短路

題目描述

給定一個n個點m條邊的有向圖,圖中可能存在重邊和自環, 邊權可能為負數。

請你求出從1號點到n號點的最多經過k條邊的最短距離,如果無法從1號點走到n號點,輸出impossible。

注意:圖中可能 存在負權回路 。

輸入格式

第一行包含三個整數n,m,k。

接下來m行,每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。

輸出格式

輸出一個整數,表示從1號點到n號點的最多經過k條邊的最短距離。

如果不存在滿足條件的路徑,則輸出“impossible”。

數據范圍

1 ≤ n , k ≤ 500 , 1≤n,k≤500, 1n,k500,
1 ≤ m ≤ 10000 , 1≤m≤10000, 1m10000,

任意邊長的絕對值不超過10000。

輸入樣例:3 3 1
1 2 1
2 3 1
1 3 3輸出樣例:3

Solution

Bellman-Ford算法

時間復雜度 O ( n m ) O(nm) O(nm), n 表示點數,m 表示邊數

一般 spfa 性能比 Bellman-Ford 好,只有特殊情況下用 Bellman-Ford 算法,比如這題有邊的數量的限制

  1. 思路
for n 次for 所有邊 a,b,wdist[b] = min(dist[b], dist[a] + w)
  1. 解題代碼
import java.util.*;
import java.io.*;class Main{// 稀疏圖用鄰接表來存儲static int N = 510;static int M = 10010;// 存儲所有邊static Node[] e = new Node[M];// 存儲距離起點的距離static int[] d = new int[N];// 備份 d 數組static int[] b = new int[N];static int idx = 1;// 初始化值static final int INF = 0x3f3f3f3f;public static void main(String[] args) throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] s = br.readLine().split(" ");int n = Integer.parseInt(s[0]);int m = Integer.parseInt(s[1]);int k = Integer.parseInt(s[2]);for(int i = 1; i <= m; i++){s = br.readLine().split(" ");int x = Integer.parseInt(s[0]);int y = Integer.parseInt(s[1]);int z = Integer.parseInt(s[2]);e[i] = new Node(x, y, z);}bellmanFord(n, m, k);}public static void bellmanFord(int n, int m, int k){Arrays.fill(d, INF);// 起點初始化為 0d[1] = 0;// 最多 k 條邊,循環限制 k 次for(int i = 0; i < k; i++){// 拷貝數組,否則會有串聯問題,導致計算邊的數量不準確b = Arrays.copyOf(d, N);for(int j = 1; j <= m; j++){int x = e[j].x, y = e[j].y, z = e[j].z;d[y] = Math.min(d[y], b[x] + z);}}if(d[n] > INF / 2){System.out.println("impossible");}else{System.out.println(d[n]);}}static class Node{int x, y, z;public Node(int x, int y, int z){this.x = x;this.y = y;this.z = z;}}
}

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

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

相關文章

查看 WSL2 (Windows Subsystem for Linux 2) IP 地址

查看 WSL2 [Windows Subsystem for Linux 2] IP 地址 1. ipconfig2. ping $(hostname).local3. cat /etc/resolv.conf4. ip route show5. ip addrReferences 1. ipconfig Windows 系統上與 WSL2 (Windows Subsystem for Linux 2) 接口的地址 172.31.32.1。 Microsoft Windows…

米爾MYC-Y6ULX-V2開發板測評記錄

文章目錄 1、板子上手體驗2、板載硬件3、系統信息4、 驅動測試5、編譯linux三大件7、攝像頭測試9、總結 1、板子上手體驗 首先非常感謝芯查查給了這樣一個機會來測評這樣一款性能十分強大的開發板&#xff0c;我拿到手的是MYC-Y6ULX-V2核心板及開發板&#xff0c;這塊板子具有…

STM32HAL-最簡單的長、短、多擊按鍵框架

目錄 概述 一、開發環境 二、STM32CubeMx配置 三、編碼 四、運行結果 五、總結 概述 本文章使用最簡單的寫法實現長、短、多擊按鍵框架&#xff0c;非常適合移植各類型單片機&#xff0c;特別是資源少的芯片上。接下來將在stm32單片機上實現&#xff0c;只需占用1個定時…

動態控制eBPF程序加載:檢查 Tracepoint、Kprobe是否存在

前言 在 eBPF 程序開發中&#xff0c;確保程序能夠在各種不同的系統配置中兼容運行是至關重要的。本文將詳細介紹一個方案&#xff0c;通過動態檢查Tracepoint、Kprobe是否存在&#xff0c;并結合libbpf的API接口控制 eBPF 程序的加載。這種方法不僅可以提升程序的靈活性&…

jwt 實現用戶登錄完整java

登錄校驗邏輯 用戶登錄的校驗邏輯分為三個主要步驟&#xff0c;分別是校驗驗證碼&#xff0c;校驗用戶狀態和校驗密碼&#xff0c;具體邏輯如下 前端發送username、password、captchaKey、captchaCode請求登錄。判斷captchaCode是否為空&#xff0c;若為空&#xff0c;則直接…

AWS聯網和內容分發服務

概況 VPC Amazon Virtual Private Cloud (Amazon VPC) 讓您能夠全面地控制自己的虛擬網絡環境&#xff0c;包括資源放置、連接性和安全性。首先在 AWS 服務控制臺中設置 VPC。然后&#xff0c;向其中添加資源&#xff0c;例如 Amazon Elastic Compute Cloud (EC2) 和 Amazon …

數據分析必備:一步步教你如何用Pandas做數據分析(15)

1、Pandas 數據丟失 Pandas 數據丟失的操作實例 在現實生活中&#xff0c;數據丟失始終是一個問題。機器學習和數據挖掘等領域在模型預測的準確性方面面臨嚴重問題&#xff0c;因為缺少值會導致數據質量較差。在這些領域中&#xff0c;缺失值處理是使模型更準確和有效的主要重…

定個小目標之每天刷LeetCode熱題(7)

今天這道題是道簡單題&#xff0c;使用雙指針進行迭代即可&#xff0c;畫了下草圖如下 代碼如下 class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode p head, q head.next, temp null;while (q ! nu…

【Python如何將EXCEL拆分】

文章目錄 Python將一個EXCEL表拆分多個excel表Python將一個EXCEL表中一個sheet拆分多個sheet表 Python將一個EXCEL表拆分多個excel表 在Python中&#xff0c;你可以使用pandas庫來讀取Excel文件&#xff0c;并將一個大的Excel表格&#xff08;工作表&#xff09;拆分成多個單獨…

Writerside生成在線幫助文檔或用戶手冊軟件基礎使用教程

Writerside是JetBrains出的一個技術文檔工具&#xff0c;既能用在JetBrains IDE上&#xff0c;也能單獨用。它能幫你輕松寫、建、測、發技術文檔&#xff0c;像產品說明、API參考、開發指南等都能搞定。 特點&#xff1a; 文檔即代碼&#xff1a;它讓你像管代碼一樣管文檔&…

【大數據Spark】常見面試題(萬字!建議收藏)

文章目錄 入門級中等難度中高級難度數據傾斜解決方法 入門級 什么是Apache Spark&#xff1f;它與傳統的MapReduce有何不同&#xff1f; Apache Spark是一個開源的分布式計算系統&#xff0c;它提供了高效的數據處理和分析能力。與傳統的MapReduce相比&#xff0c;Spark具有更快…

海光CPU:國產信創的“芯“動力解讀

國產信創CPU-海光CPU CPU&#xff1a;信創根基&#xff0c;國之重器 國產CPU形成三大陣營&#xff1a;自主架構、x86及ARM。自主陣營中&#xff0c;龍芯和申威以LoongArch和SW-64為基石&#xff1b;ARM陣營由鯤鵬、飛騰主導&#xff0c;依托ARM授權研發處理器&#xff1b;x86陣…

紅帽練習 之邏輯卷 pv lv gv

邏輯卷習題 1 在/dev/sdb 存儲設備上創建物理設備分區 創建2個大小各為256MB的分區 并設置為linux lvm類型 使用first 和second 作為這些分區的名稱 parted /dev/sdb mklabel gpt parted /dev/sdb primary mkpart first 1M 256M parted /dev/sdb set 1 …

【Linux|數據恢復】extundelete和ext4magic數據恢復工具使用

環境&#xff1a;Centos7.6_x86 一、extundelete工具 1、extundelete介紹 Extundelete 是一個數據恢復工具&#xff0c;用于從 ext3 或 ext4 分區中恢復刪除文件。根據官網0.2.4版本介紹是支持ext4&#xff0c;但實際上使用發現ext4格式有些問題&#xff0c;會報以下錯誤&…

動態SQL IF語句

IF語句學習 第一種寫法(標準) 我們先來看以下標準寫法: select * from .. <where> <if test""> and ....... <if test""> and ....... <where> 我們用了一個where標簽 , 內嵌if語句 第二種寫法: 這是第二種寫法:不用where標…

大降分!重郵計算機專碩復試線大降50分!重慶郵電計算機考研考情分析!

重慶郵電大學&#xff08;Chongqing University of Posts and Telecommunications&#xff09;簡稱重郵&#xff0c;坐落于中國重慶市主城區南山風景區內&#xff0c;是中華人民共和國工業和信息化部與重慶市人民政府共建的教學研究型大學&#xff0c;入選國家“中西部高校基礎…

一篇文章搞懂Go語言切片底層原理(圖文并茂+舉例講解)

1. 切片和數組的底層關系 Go語言切片的數據結構是一個結構體&#xff1a; type slice struct {array unsafe.Pointerlen intcap int }Go語言中切片的內部結構包含地址、大小和容量。將數組比喻成一個蛋糕&#xff0c;那么切片就是需要切的那一塊&#xff0c;而那一塊的的…

c++學生管理系統

想要實現的功能 1&#xff0c;可以增加學生的信息&#xff0c;包括&#xff08;姓名&#xff0c;學號,c成績&#xff0c;高數成績&#xff0c;英語成績&#xff09; 2&#xff0c;可以刪除學生信息 3&#xff0c;修改學生信息 4&#xff0c;顯示所有學生信息 5&#xff0c…

支持AMD GPU的llm.c

anthonix/llm.c: LLM training in simple, raw C/HIP for AMD GPUs (github.com) llm.c for AMD devices This is a fork of Andrej Karpathys llm.c with support for AMD devices. 性能 在單個7900 XTX顯卡上使用默認設置&#xff0c;目前的訓練步驟耗時約為79毫秒&#x…

Docker的安裝、啟動和配置鏡像加速

前言&#xff1a; Docker 分為 CE 和 EE 兩大版本。CE 即社區版&#xff08;免費&#xff0c;支持周期 7 個月&#xff09;&#xff0c;EE 即企業版&#xff0c;強調安全&#xff0c;付費使用&#xff0c;支持周期 24 個月。 而企業部署一般都是采用Linux操作系統&#xff0c;而…