題目 Dijkstra 列舉 路

2021-09-25 18:14:03 字數 1494 閱讀 1863

時間限制: 1 sec 記憶體限制: 128 mb

題目描述

farmer john 熱衷於散步,每天早上他都要從 1 號倉庫走到 n 號倉庫。 farmer john 家的 n 個倉庫被 m 條雙向道路連通起來,每條道路有乙個長度 w。而farmer john 又不喜歡走路,所以他走的是從 1 號倉庫到 n 號倉庫的最短路。

但是 farmer 的奶牛們總想搞點事情,他們計畫著把 m 條道路的其中一條變成原來長度的 2 倍,使得 farmer john 可能會多走一點路。

他們想知道,最多能讓 farmer john 多走多少路呢?

輸入第一行乙個正整數 n,m,表示倉庫個數和道路條數。

接下來 m 行,每行三個正整數,表示每條雙向道路的連線的倉庫和該雙向道路的長度。

輸出輸出只有一行,表示最多能讓 farmer john 每天早上多走多少路。

樣例輸入

複製樣例資料

5 72 1 5

1 3 1

3 2 8

3 5 7

3 4 3

2 4 7

4 5 2

樣例輸出2提示

一開始的最短路為1→3→4→5,長度為1+3+2=6。

將連線3和4的邊變為原來的兩倍,3×2=6。

改造後的圖,最短路為1→3→5,長度為1+7=8。

多走了8−6=2的路程,可以證明這是最大的答案。

對於50%的資料,1≤n≤50。

對於100%的資料,1≤n≤250,1≤m≤25000,1≤w≤106。

保證沒有重邊。

#include

using namespace std;

typedef

long

long ll;

const

int maxn=

300;

const

int inf=

0x3f3f3f3f

;bool vis[maxn]

;ll d[maxn]

;int way[maxn]

[maxn]

;int path[maxn]

;int n,m,u,v,w;

bool once=true;

void

dijkstra()

} vis[x]

=true;

for(

int y=

1;y<=n;y++)}

}}}int

main()

dijkstra()

; ll minway=d[n]

; once=false;

int pos=n;

ll maxminway=minway;

while

(true)

printf

("%lld\n"

,maxminway-minway)

;return0;

}

poj 1062 dijkstra 列舉區間

要求 n個點每個點有乙個權值和等級,每個點有x條有向邊,有向邊也有權值。從第1個點出發,到每個點的路徑的權值等於每條邊的權值加上終點的權值。路徑的等級最大值與等級最小值的差值不大於m,終點可以是第1個點。求路徑權值最小值。方法 dijkstra 列舉區間 1.dijkstra求最短路時注意列舉區間等...

昂貴的聘禮 dijkstra 列舉區間

年輕的探險家來到了乙個印第安部落裡。在那裡他和酋長的女兒相愛了,於是便向酋長去求親。酋長要他用10000個金幣作為聘禮才答應把女兒嫁給他。探險家拿不出這麼多金幣,便請求酋長降低要求。酋長說 嗯,如果你能夠替我弄到大祭司的皮襖,我可以只要8000金幣。如果你能夠弄來他的水晶球,那麼只要5000金幣就行...

題目四 路徑和

給定乙個包含非負整數的 m x n 網格 grid 請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。說明 每次只能向下或者向右移動一步。輸入 grid 1,3,1 1,5,1 4,2,1 輸出 7 override public int minpathsum int grid int ...