P1576 最小花費 洛谷

2022-05-06 19:24:09 字數 1993 閱讀 6089

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

輸入格式:

第一行輸入兩個正整數n,m,分別表示總人數和可以互相轉賬的人的對數。

以下m行每行輸入三個正整數x,y,z,表示標號為x的人和標號為y的人之間互相轉賬需要扣除z%的手續費 (z<100)。

最後一行輸入兩個正整數a,b。資料保證a與b之間可以直接或間接地轉賬。

輸出格式:

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

輸入樣例#1:

3 3                                     

1 2 1

2 3 2

1 3 3

1 3

輸出樣例#1:

103.07153164
1<=n<=2000

設得到錢的一方的錢為x,則發錢一方的錢至少為x/(1-z),可以與處理每兩個人的間的交易損失,跑一邊最大路(注意是乗,意會去~~)

ans=100/dis[b]了。。

時隔多月,發現自己好像快看不懂dijkstra了、、、

加乙個spfa

1 #include2 #include3 #include4 #include5 #include6 #include7

#define n 2005

8using

namespace

std;

9double

dis[n],z;

10int

n,m,x,y,s,t,tot,head[n];

11struct

edge

12edge[n*n];

16int

read()

1720

while(ch>='

0'&&ch<='9')

21return x*f;22}

23int add(int x,int y,double

z)24

31void spfa(int

s)3250}

51}52 vis[x]=false;53

}54}55

intmain()

5665 s=read(),t=read();

66spfa(s);

67double ans=100/dis[t];

68 printf("

%.8lf

",ans);

69 }

view code

#include #include 

#include

#include

#define maxn 1e20

using

namespace

std;

intn,m,a,b,k,x,y,z;

double val[2005][2005],w[2005

],minn;

bool vis[2005

];int

main()

scanf(

"%d%d

",&a,&b);

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

w[i]=val[a][i];

w[a]=1

; vis[a]=1

;

for(int i=1;i)

vis[k]=1

;

if(k==b) break

;

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

if(!vis[j]&&w[j]w[k])

w[j]=val[k][j]*w[k];

}printf(

"%.8lf

",100/w[b]);

return0;

}

洛谷P1576 最小花費

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

洛谷 P1576 最小花費

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

洛谷P1576 最小花費

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