最小花費問題 (最短路徑演算法)

2021-08-10 15:04:08 字數 1453 閱讀 3024

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

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

以下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

一道模板題,套用一下演算法就可以出來,唯一不一樣的由於匯率的問題我們把它作相乘處理而不是相加。

dijkstar演算法:

#include#include#include#includeusing namespace std;

const int n=2010;

const int maxn=99999999;

double a[n][n];

double dis[n];

double min_dis;

double w;

bool vis[n];

int n,m,u,v,start,endd,min_k;

inline int read()

while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();

return x*f;}

void dijkstar()}

int main()

spfa演算法:

#include#include#include#include#define n 2005

using namespace std;

double dis[n],z;

int n,m,x,y,a,b,tot,head[n];

struct edge

edge[n*n];

int add(int x,int y,double z)

void spfa(int s)

{ queueq; bool vis[n];

for(int i=1;i<=n;i++) vis[i]=false;

q.push(s),vis[s]=true,dis[s]=1;

while(!q.empty())

{int x=q.front();q.pop();

for(int i=head[x];i;i=edge[i].next)

{int t=edge[i].to;

if(dis[t]

最小花費最短路

給你n個點,m條無向邊,每條邊都有長度d和花費p,給你起點s終點t,要求輸出起點到終點的最短距離及其花費,如果最短距離有多條路線,則輸出花費最少的。多組資料 每組資料描述如下 輸入n,m,點的編號是1 n,然後是m行,每行4個數 a,b,d,p,表示a和b之間有一條邊,且其長度為d,花費為p。最後一...

最短路 最小花費(spfa)

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

最小花費( 最短路Dijkstra或SPFA)

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