POJ 3621 二分 判定負環

2021-10-21 21:47:59 字數 1711 閱讀 2038

題意

傳送門 poj 3621 sightseeing cows

題解二分答案,問題轉化為判定滿足圖中存在乙個環,滿足下式的最大的 xxx∑

fi∑t

j>

x\frac>x

∑tj​∑f

i​​>

x 若環上存在重複經過的點,其 f

if_i

fi​ 只算一次,圖中點、邊數量不同。出現上述情況時,環由至少兩個簡單環構成。假設兩個環上 fi,

ti

f_i,t_i

fi​,ti

​ 的和分別為 x1,

y1

x_1,y_1

x1​,y1

​ 和 x2,

y2

x_2,y_2

x2​,y2

​,環的某個交點為 p

pp,則有 max⁡(

x1y1

,x2y

2)≥x

1+x2

y1+y

2>x1

+x2−

fpy1

+y

2\max(\frac,\frac)\geq \frac>\frac

max(y1

​x1​

​,y2

​x2​

​)≥y

1​+y

2​x1

​+x2

​​>y1

​+y2

​x1​

+x2​

−fp​

​ 可以觀察到取簡單環時答案更優,此時環上點、邊數量相同。按照 0/1

0/10/

1 分數規劃的思想,將上式轉換為 ∑(t

ix−f

i)

<

0\sum (t_ix-f_i)<0

∑(ti​x

−fi​

)<0 spf

aspfa

spfa

判定圖中是否存在負環即可。

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

1005

, maxm =

5005

, inf =

0x3f3f3f3f

;const

double eps =

1e-4

;int n, m, f[maxn]

, cnt[maxn]

;int tot, head[maxn]

, to[maxm]

, t[maxm]

, nxt[maxm]

;double cost[maxm]

, ds[maxn]

;bool in[maxn]

;void

inline

add(

int x,

int y,

int t)

bool

spfa()

}}return0;

}bool

judge

(double x)

intmain()

printf

("%.2f\n"

, ub)

;return0;

}

poj 3621 最優比率環

思路 之前做過最小比率生成樹,也是屬於0 1整數劃分問題,這次碰到這道最優比率環,很是熟悉,可惜精度沒控制好,要不就是wa,要不就是tle,鬱悶啊!實在是懶得碼字,直接copy吧 題目的意思是 求乙個環的除以,使得那個環在所有環中除以最大。令在乙個環裡,點權為v i 對應的邊權為e i 即要求 i ...

poj3621 最優比率環

這道題的意思是給你乙個圖,有點權和邊權,你的任務是求乙個圈,使得這個圈的點權和比邊權和最大,我們依然可以使用01規劃的知識,將一條邊的權值變為ai mid bi,看看這個圖裡面有沒有正環,有的話說明還存在更優的解,這裡的正環問題可以將邊權值取反變成負環問題,如下 include include in...

POJ3259負環判定

題意 有n個頂點,m條邊,然後有w個洞,過每個洞的時間為 ti,求是否會時光倒流 分析 就是求是否存在負圈,用bellman floyd判定是否存在負圈即可,注意是無向圖,所以路徑是雙向可達的 1 include 2 include 3 include 4 include 5 include 6 i...