L2-001 緊急救援 (25分)java
作為一個城市的應急救援隊伍的負責人,你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連線城市的快速道路。每個城市的救援隊數量和每一條連線兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助電話給你的時候,你的任務是帶領你的救援隊儘快趕往事發地,同時,一路上召集儘可能多的救援隊。
輸入格式:
輸入第一行給出4個正整數N、M、S、D,其中N(2≤N≤500)是城市的個數,順便假設城市的編號為0 ~ (N−1);M是快速道路的條數;S是出發地的城市編號;D是目的地的城市編號。
第二行給出N個正整數,其中第i個數是第i個城市的救援隊的數目,數字間以空格分隔。隨後的M行中,每行給出一條快速道路的資訊,分別是:城市1、城市2、快速道路的長度,中間用空格分開,數字均為整數且不超過500。輸入保證救援可行且最優解唯一。
輸出格式:
第一行輸出最短路徑的條數和能夠召集的最多的救援隊數量。第二行輸出從S到D的路徑中經過的城市編號。數字間以空格分隔,輸出結尾不能有多餘空格。
輸入樣例:
4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2
輸出樣例:
2 60
0 1 3
程式碼:java最後一點超時
import java.util.Scanner;
public class Main{
private static int[] dis,w,pre,num,weight;
private static boolean[] vis;
private static int n,m,s,d;
private static int[][] G;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();m = sc.nextInt();
s = sc.nextInt();d = sc.nextInt();
dis = new int[n];vis = new boolean[n];w=new int[n];pre=new int[n];num=new int[n];
weight = new int[n];
G = new int[n][n];//鄰接矩陣
for(int i = 0; i<n; i++){
weight[i] = sc.nextInt();
dis[i] = 1000;//設起點到達各點的最短距離
}
for(int i = 0; i<n; i++){
for(int j = 0; j<n; j++){
if(i != j)
G[i][j] = 1000;
}
}
for(int i = 0; i<m; i++){
int a = sc.nextInt();int b = sc.nextInt();int c = sc.nextInt();
G[a][b] = c;
G[b][a] = c;
}
Dijkstra(s);
System.out.println( num[d]+" "+w[d]);
dfs(s,d);
System.out.println();
}
private static void dfs(int s,int v){
if(s == v){
System.out.print(s);
return;
}
dfs(s,pre[v]);
System.out.print(" "+v);
}
private static void Dijkstra(int s) {
dis[s] = 0;//將起點到達自身的距離修改為0;
num[s] = 1;//最短路徑條數初始化為1;
w[s] = weight[s];//救援隊數目修改為起點城市的救援隊數目
for (int i = 0; i<n; i++){
int u = -1,min = 1000;
for(int j = 0; j<n; j++){
if(!vis[j] && dis[j] < min){
min = dis[j];
u = j;
}
}
if(u == -1)return;
vis[u] = true;
for(int v = 0; v<n; v++){
if(!vis[v] && G[u][v] != 1000 && dis[u] + G[u][v] < dis[v]){
dis[v] = dis[u] + G[u][v];
w[v] = w[u]+weight[v];
num[v] = num[u];
pre[v] = u;
}else if(!vis[v] && G[u][v] != 1000 &&dis[u] + G[u][v] == dis[v]){
num[v] += num[u];//最短距離相同時路徑條數累加
if(w[v] < w[u]+weight[v]){
w[v] = w[u]+weight[v];
pre[v] = u;
}
}
}
}
}
}
相關文章
- L2-001 緊急救援
- L2-001 緊急救援【最短路】
- L2-001 緊急救援 (25分)
- 伸出援助之手!IGG向土耳其災區緊急捐贈救援物資
- L2-001 緊急救援 (25分)【新增陣列求最短路數量】【pre陣列記錄最短路徑】陣列
- iPhone緊急聯絡人設定教程 iPhone怎麼設定緊急聯絡人?iPhone
- 小米手機設定緊急聯絡人方法 小米能設定緊急聯絡人嗎?
- 華為手機緊急聯絡人使用教程 華為手機緊急呼叫怎麼設定?
- win10系統如何緊急重新啟動_win10緊急重新啟動的使用教程Win10
- OPPO手機緊急聯絡人設定使用教程 OPPO手機怎麼設定緊急聯絡人
- Oracle緊急固定執行計劃之手段Oracle
- Redis 6.0.8 緊急釋出,請儘快升級!Redis
- GeForce Experience曝出高危漏洞:NVIDIA緊急釋出更新
- Chrome存在高危漏洞!谷歌緊急釋出安全補丁Chrome谷歌
- 時間緊急!資料庫遷移怎麼才能更快?資料庫
- 《柳葉刀》:更有效的緊急避孕措施誕生了!
- 優步的緊急按鈕及其背後的技術
- 遇到緊急問題,不要慌:抓包分析來救你(一)
- 【緊急】Spring爆出比Log4j2還大的漏洞?Spring
- 谷歌將停止對其緊急位置共享應用Trusted Contacts的支援谷歌Rust
- 螞蟻金服微貸前端技術團隊 緊急招聘公告前端
- 修復高危漏洞,谷歌 Chrome 瀏覽器釋出 107 緊急更新谷歌Chrome瀏覽器
- 線上故障突突突?如何緊急診斷、排查與恢復
- 緊急救援百度雲(完整共享)網盤【1080P】完整無刪減資源已.
- 多鏈路聚合技術的實際應用,提高應急指揮救援通訊網路
- 牛津詞典:2019年度詞彙為“氣候緊急狀態”
- 亞信安全釋出防範WannaCry/Wcry蠕蟲勒索病毒緊急通告!
- 緊急提醒!冒充京東客服的登出“校園貸”詐騙已升級!
- 大轉折!政府緊急出手為矽谷銀行兜底!BTC大漲近10%!
- 曝出漏洞、企業禁用、緊急宣告:Zoom 一週裡經歷了什麼?OOM
- 微軟緊急釋出10個IE補丁使用者應火速升級微軟
- 衛生系統中招勒索病毒的應對措施和緊急恢復辦法
- 7.4%接受緊急氣管插管的患者:“身體動不了,意識卻醒著”
- 客戶服務管理:CRM實現緊急應對客戶常見問題
- 乾元通渠道商中標邯鄲市某消防救援應急宣傳資料傳輸專案
- 強效的檔案救援軟體救援已刪除的PST檔案
- [譯] Google 工程師提升網頁效能的新策略:空閒執行,緊急優先Go工程師網頁
- GPT-5覺醒引人類滅絕?DeepMind緊急教AI做人,論文登頂刊GPTAI