【題目描述】
在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。
【樣例輸入】
3 31 2 1
2 3 2
1 3 3
1 3【樣例輸出】
103.07153164
【樣例說明】
選擇轉賬路徑為1->2>3,則最小花費為103.07153164元。
【解題思路】
閱讀題目可以發現這是一道求a到b的最短路徑問題,略有不同的是這裡以相乘的方式累計路徑上的權值。對於一對點之間的最短路我們可以用dijkstra來求,用ans=100統計所需的費用即是答案。
【源**】/pas
var
n,m,i,j:longint;
v:array[1..2000,1..2000]of real;
b:array[1..2000]of boolean;
d:array[1..2000]of real;
x,y,z,u,s,e:longint;
min:real;
begin
readln(n,m);
for i:=1 to m do
begin
readln(x,y,z);
v[x,y]:=(100-z)/100;
v[y,x]:=(100-z)/100;
end;
readln(s,e);
b[s]:=true;
d:=v[s];
repeat
min:=0;//maxlongint;
u:=0;
for i:=1 to n do
if (not b[i])and(d[i]>min) then
begin
min:=d[i];
u:=i;
end;
if u<>0 then
begin
b[u]:=true;
for i:=1 to n do
if (not b[i])and(d[u]*v[u,i]>d[i]) then
d[i]:=d[u]*v[u,i];
end;
until u=0;
writeln(100/d[e]:0:8);
end.
SSLOJ2206最小花費 P1576
在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後b收到100元。第一行輸入兩個用空格隔開的正整數n和m,分別表示總人數和可以互相轉賬的人的對數。以下m行每行輸入三個用空格隔開的正整數...
最小花費 Dijkstra
原題鏈結傳送門 d es crip tion description descri ptio n在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後b收到100元。i np ut inp...
砍樹最小花費
題意 有n種樹,每種樹給出高度h,砍掉每顆樹的花費c,每種樹的數量p,現在要砍掉一些樹,使得最高的樹的數量超過所有樹的一半,問最小花費。不同種類的樹高度可能相同 題解 列舉不同的高度,把高於它的樹都砍掉,然後比它矮的樹挑便宜的砍,使得該高度的樹佔所有樹的1 2 1。給樹按高度排序,首先可以用字尾和預...