DIJ 最小花費 洛谷 P1576

2021-10-07 12:05:07 字數 2407 閱讀 1072

在 n 個人中,某些人的銀行賬號之間可以互相轉賬。

這些人之間轉賬的手續費各不相同。

給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問 a 最少需要多少錢使得轉賬後 b 收到 100 元。

輸入格式

第一行輸入兩個正整數 n,m,分別表示總人數和可以互相轉賬的人的對數。

以下 m 行每行輸入三個正整數 x,y,z,表示標號為 x 的人和標號為 y 的人之間互相轉賬需要扣除 z 的手續費 ( z<100 )。

最後一行輸入兩個正整數 a,b。

資料保證 a 與 b 之間可以直接或間接地轉賬。

輸出格式

輸出 a 使得 b 到賬 100 元最少需要的總費用。

精確到小數點後 8 位。

資料範圍1≤n

≤2000,m

≤105

1≤n≤2000, m≤10^5

1≤n≤20

00,m

≤105

輸入樣例:

3 3

1 2 1

2 3 2

1 3 3

1 3

輸出樣例:

103.07153164
分析:我們假

設a最初

擁有a0

元,經過

k次轉賬

,記每次

轉賬的手

續費為c

i,wi

=100−c

i100

。我們假設a最初擁有a_0元,經過k次轉賬,記每次轉賬的手續費為c_i,w_i=\frac。

我們假設a最

初擁有a

0​元,

經過k次

轉賬,記

每次轉賬

的手續費

為ci​

,wi​

=100

100−

ci​​

。 則 目標

為:a0

×(w1

w2..

.wk)

≥100,解

得a0≥

100w1w

2...

wk

。則目標為:a_0×(w_1w_2...w_k)≥100,解得a_0≥\frac。

則目標為:a

0​×(

w1​w

2​..

.wk​

)≥10

0,解得

a0​≥

w1​w

2​..

.wk​

100​

。 因 此,

我們需要

計算出w

1w2.

..wk

的最大值

。因此,我們需要計算出w_1w_2...w_k的最大值。

因此,我們需

要計算出

w1​w

2​..

.wk​

的最大值

。 以 wi

=100−c

i100為邊

權建圖,

跑一遍d

ijks

tra求

出從a到

b的最長

路w1w

2...

wk即可

。以w_i=\frac為邊權建圖,跑一遍dijkstra求出從a到b的最長路w_1w_2...w_k即可。

以wi​=1

0010

0−ci

​​為邊

權建圖,

跑一遍d

ijks

tra求

出從a到

b的最長

路w1​

w2​.

..wk

​即可。

**:

#include

#include

#include

#include

using

namespace std;

const

int n=

2010

;int n,m,s,t;

double g[n]

[n],dis[n]

;bool st[n]

;void

dijkstra()

}int

main()

cin>>s>>t;

dijkstra()

;printf

("%.8lf\n"

,100

/dis[t]);

return0;

}

洛谷P1576 最小花費

在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後b收到100元。輸入格式 第一行輸入兩個正整數n,m,分別表示總人數和可以互相轉賬的人的對數。以下m行每行輸入三個正整數x,y,z,表...

洛谷 P1576 最小花費

題目戳 題目描述 在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後b收到100元。輸入輸出格式 輸入格式 第一行輸入兩個正整數n,m,分別表示總人數和可以互相轉賬的人的對數。以下m行...

P1576 最小花費 洛谷

在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後b收到100元。輸入格式 第一行輸入兩個正整數n,m,分別表示總人數和可以互相轉賬的人的對數。以下m行每行輸入三個正整數x,y,z,表...