最小花費 ssl2206 dijkstra

2021-07-11 05:00:03 字數 1509 閱讀 8901

【題目描述】
在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。給樹按高度排序,首先可以用字尾和預...