最小花費 (Dijkstra演算法)

2021-10-01 18:44:05 字數 1391 閱讀 2228

在n

nn個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a

aa最少需要多少錢使得轉賬後b

bb收到100元。

第一行輸入兩個用空格隔開的正整數n

nn和m

mm,分別表示總人數和可以互相轉賬的人的對數。以下m行每行輸入三個用空格隔開的正整數 x

xx , y

yy , z

zz,表示標號為x的人和標號為y的人之間互相轉賬需要扣除z

zz%的手續費(

z<

100)

( z < 100 )

(z<10

0)。最後一行輸入兩個用空格隔開的正整數a

aa和b

bb。資料保證a

aa與b

bb之間可以直接或間接地轉賬。

輸出a

aa使得b

bb到賬100元最少需要的總費用。精確到小數點後8位。

input

3 31 2 1

2 3 2

1 3 3

1 3output

103.07153164

逆轉思維一下,求出拿走手續費後b

bb拿到的錢佔原本的錢的百分比,b

bb拿的一定是100,用100除以那個百分比就等於最小花費

說明 費用乘乙個百分數=100

使得 費用最小

所以 那個百分數最大

#include

#include

using namespace std;

int n,m,x,y,z,s,t,p[2200]

;double f[2200]

[2200],c[2200]

;int main(

) scanf(

"%d%d",&s,&t)

; p[s]

=1;for

(int i=1;i<=n;i++)

c[i]

=f[s]

[i]; //初始賦初值

for(int i=1;ip[k]

=1; //標記做過

for(int j=1;j<=n;j++)

if(p[j]

==0&&c[k]*f[k]

[j]>c[j]

) c[j]

=c[k]*f[k]

[j]; //更新未走過的點能拿到的最大的百分數

} printf(

"%.8lf",100/c[t]

); //100除以這個百分數得出最小花費

return 0;

}

最小花費 Dijkstra

原題鏈結傳送門 d es crip tion description descri ptio n在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後b收到100元。i np ut inp...

最小花費 ssl2206 dijkstra

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

最小花費( 最短路Dijkstra或SPFA)

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