POJ 1860判斷正環

2021-10-01 10:28:44 字數 1162 閱讀 1054

題目鏈結

題意

有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,...