最小花費 Dijkstra

2021-10-01 18:44:05 字數 2266 閱讀 8765

原題鏈結傳送門

d es

crip

tion

description

descri

ptio

n在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後b收到100元。

i np

ut

input

inpu

t第一行輸入兩個用空格隔開的正整數n(n<2000)和m,分別表示總人數和可以互相轉賬的人的對數。以下m行每行輸入三個用空格隔開的正整數x,y,z,表示標號為x的人和標號為y的人之間互相轉賬需要扣除z%的手續費(z<100)。最後一行輸入兩個用空格隔開的正整數a和b。資料保證a與b之間可以直接或間接地轉賬。

o ut

pu

toutput

output

輸出a使得b到賬100元最少需要的總費用。精確到小數點後8位。

s am

plei

nput

sample~input

sample

inpu

t3 3

1 2 1

2 3 2

1 3 3

1 3sam

pleo

utpu

tsample~output

sample

outp

ut103.07153164

dijkstra拓展題

不難,但需要思考。

我們要反向求出兩個點之間的距離(扣除的錢變成加的錢),最後在倒過來

因為是反向百分比,所以判斷的時候

不是c [j

]

nn

c[j]c[

j]nn

,而是c[j

]>ma

xx

c[j]>maxx

c[j]

>ma

xx.並且因為是百分比,

求最短的時候要用乘法

小心超時和爆記憶體!

沒用s ca

nf

scanf

scanf:

time limit exceed

用了sca

nf

scanf

scanf:

accepted 32896k 557ms

scanf是個好東西

#include

#include

#include

using

namespace std;

int n,m,x,y,z,s,e,k;

double f[

2010][

2010

],maxx;

//一定不要忘記用double

double c[

10010];

bool b[

10010];

intmain()

scanf

("%d%d"

,&s,

&e);

for(

int i=

1; i<=n; i++

) c[i]

=f[s]

[i];

//存點的位置

b[s]=1

; c[s]=1

;for

(int i=

1; i<=n-

1; i++)if

(k==0)

break

; b[k]=1

;for

(int j=

1; j<=n; j++)if

(c[k]

*f[k]

[j]>c[j]

&&b[j]==0

)//百分比用乘法

c[j]

=c[k]

*f[k]

[j];

}printf

("%.8f"

,100.0

/c[e]);

return0;

}

最小花費 (Dijkstra演算法)

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

最小花費 ssl2206 dijkstra

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

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

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