SPFA 跑得快,跑得快。最小花費問題

2021-07-27 03:49:07 字數 1743 閱讀 5116

1443: 最小花費

在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

最短路

我給出兩種寫法,dijstra跑的比較慢,spfa快了將近一倍。

給出**

#include

#include

#include

using

namespace

std;

const

int maxn=2505;

int n,m,st,end;

double

map[2001][2001];

double d[maxn]=;

double ans;

bool vis[maxn]=;

void dijstra(int s)

d[s]=1;

vis[s]=true;

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

}if(u==-1) return;

vis[u]=true;

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

}int main()

scanf("%d%d",&st,&end);

dijstra(st);

ans=100/d[end];

printf("%.8f %f",ans,d[end]);

}//用的矩陣存圖,演算法是djistra;

下面是spfa的寫法

#include

#include

#include

#include

using

namespace

std;

int n,m,a,b;

double dis[2010];

double g[2001][2001];

queue

q;int readint()

struct node

}arc[400000];

int first[20005],cur=0;

void add(const

int&a,const

int&b,const

int&c)

void in()

a=readint();

b=readint();

}void spfa(int x)

; dis[x]=1;

flag[x]=true;

q.push(x);

while(!q.empty())

} m=arc[m].next;}}

}int main()

//spfa的寫法,加了讀入優化和靜態鍊錶的存圖方式,速度是香港記者。

生活不是跑得快

相信很多人都知道乙個大眾化的撲克牌遊戲,叫跑得快。四個玩家一起抓牌,然後按照規則,看誰能夠先走完牌。於是,為了掙這個第一,大家拼命壓制別人,誰也不想讓別人先走。於是出現了乙個很常見的現象 一些聰明的人,常常偽裝自己,讓別人以為自己的牌很差,怎麼也走不了,於是,剩下的三個人就在那裡互相壓制,最後,他看...

邏輯推理與判斷(誰家孩子跑得快)

file name reasoning.c creat data 2015.1.27 author zy 邏輯推理與判斷 誰家孩子跑得快 張,王,李三家各有乙個小孩。一天,三家的九個孩子在一起比賽短跑,規定不分年齡大小,跑第一得9分,跑第二得8分,依次類推,比賽結果各家總分相同,且這些孩子沒有同時到...

感覺流量跑得快?那麼有什麼控制流量的方法呢?

一 調整網路設定 1.手機不上網時盡量關閉蜂窩資料開關 2.有wi fi 的情況下建議切換到有安全的 wi fi 網路3.網路情況下進行4.i os9系統手機使用者建議關閉無線區域網助理功能,使 wi fi 網路訊號弱的情況下不會自動切換至蜂窩資料上網 二 改變使用習慣 1.軟體,通過官方渠道對 軟...