例4 4 最小花費

2022-05-29 06:06:12 字數 1681 閱讀 1623

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

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

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

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

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

3 3

1 2 1

2 3 2

1 3 3

1 3

103.07153164

【資料規模】

1<=n<=2000

法一:spfa:

#include#include

#include

#include

#include

#define for(a,b,c) for(int a=b;a<=c;a++)

using

namespace

std;

const

int max_n = 2005

;struct

edge

edge(

const

int tt,const

intcc)

};vector

g[max_n];

queue

q;bool

inq[max_n];

double

dis[max_n];

double js(double u,int

cos)

void spfa(int

x) }}}

}int

main()

cin>>s>>e;

memset(dis,

127,sizeof

(dis));

spfa(e);

printf(

"%.8lf\n

",dis[s]);

}

法二:dijkstra

#includeusing

namespace

std;

const

int max_n = 2000 + 5,max_m = max_n*max_n;

intn,m,s,t,to[max_m],head[max_m],nxt[max_m],_num;

double

dis[max_n],co[max_m];

bool

vis[max_n];

struct

edge

}e[max_m];

priority_queue

q;void isadd(int u,int v,double

w)void dijkstra(int

s));

while(!q.empty()));}}

}}int

main()

cin>>s>>t;

dijkstra(s);

printf(

"%.8lf

",100.0/dis[t]);

}

最小花費 Dijkstra

原題鏈結傳送門 d es crip tion description descri ptio n在n個人中,某些人的銀行賬號之間可以互相轉賬。這些人之間轉賬的手續費各不相同。給定這些人之間轉賬時需要從轉賬金額裡扣除百分之幾的手續費,請問a最少需要多少錢使得轉賬後b收到100元。i np ut inp...

砍樹最小花費

題意 有n種樹,每種樹給出高度h,砍掉每顆樹的花費c,每種樹的數量p,現在要砍掉一些樹,使得最高的樹的數量超過所有樹的一半,問最小花費。不同種類的樹高度可能相同 題解 列舉不同的高度,把高於它的樹都砍掉,然後比它矮的樹挑便宜的砍,使得該高度的樹佔所有樹的1 2 1。給樹按高度排序,首先可以用字尾和預...

題目1086 最小花費

題目描述 在某條線路上有n個火車站,有三種距離的路程,l1,l2,l3,對應的 為c1,c2,c3.其對應關係如下 距離s 票價 0l1l2輸入保證0每兩個站之間的距離不超過l3。當乘客要移動的兩個站的距離大於l3的時候,可以選擇從中間乙個站下車,然後買票再上車,所以乘客整個過程中至少會買兩張票。現...