題目鏈結
題意
有n種型別的貨幣,m個城市可以兌換兩種貨幣,乙個人手上有v塊s型別的錢,要求判斷是否可以經過若干次兌換後這個人手上的s型別的錢增加了。
思路
對於每種貨幣,建立乙個點,兩種貨幣可以交換,則這兩個點之間有一條邊, 經過若干次兌換後要回到s型別的錢,則一定存在環,而錢要增加,則需要存在正權環,所以用通過上述方法建圖,然後跑spfa,注意初始化d陣列要初始化為-inf,並且鬆弛條件改為(d[y] < (d[x] - c[i]) * edge[i])。也就是能使錢增加的判斷條件。
#include
#include
#include
#include
#include
using
namespace std;
#define inf 0x3f3f3f3f
typedef
long
long ll;
const ll max =
1e9;
const ll maxn =
1e3+10;
int head[maxn]
, to[maxn]
, nex[maxn]
, cnt;
//鏈式前向星
double edge[maxn]
, c[maxn]
;int vis[maxn]
, num[maxn]
;double d[maxn]
;void
init()
void
add(
int x,
int y,
double c1,
double c2)
bool
spfa
(int s,
int n,
double sum)}}
}return
false;}
intmain()
if(spfa
(s, n, v)
)printf
("yes\n");
else
printf
("no\n");
return0;
}
POJ 1860(spfa 判斷正環)
題意 我們的城市有幾個貨幣兌換點。讓我們假設每乙個點都只能兌換專門的兩種貨幣。可以有幾個點,專門從事相同貨幣兌換。每個點都有自己的匯率,外匯匯率的a到b是b的數量你1a。同時各交換點有一些佣金,你要為你的交換操作的總和。在 貨幣中總是收取佣金。例如,如果你想換100美元到俄羅斯盧布兌換點,那裡的匯率...
poj1860 解題報告
題意 這裡有n種貨幣,分別記為1 n,有m種貨幣交換的方式,每一種方式有a,b兩種錢幣,有rab,cab,rba and cba,四個數,表示交換率,nick手上有其中的一種貨幣s,貨幣s的錢數為v,問你能否通過一定次數的錢幣交換讓nick手中的錢增加 分析 這裡是要判斷迴路,那麼可以用spfa 加...
poj1860解題報告 兩種解法
include iostream include fstream include sstream include string include vector using namespace std struct record struct list typedef vector g int n,m,...