在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:1 2 1
2 3 2
1 3 3
1 3
103.071531641<=n<=2000
設得到錢的一方的錢為x,則發錢一方的錢至少為x/(1-z),可以與處理每兩個人的間的交易損失,跑一邊最大路(注意是乗,意會去~~)
ans=100/dis[b]了。。
時隔多月,發現自己好像快看不懂dijkstra了、、、
加乙個spfa
1 #include2 #include3 #include4 #include5 #include6 #include7view code#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 }
#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...