原題鏈結傳送門
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 557msscanf是個好東西
#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 行每行輸入三...