bzoj 4773 負環 倍增

2022-04-30 06:30:06 字數 1167 閱讀 4926

在忘記考慮負環之後,黎瑟的演算法又出錯了。對於邊帶權的有向圖 g = (v, e),請找出乙個點數最小的環,使得

環上的邊權和為負數。保證圖中不包含重邊和自環。

第1兩個整數n, m,表示圖的點數和邊數。

接下來的m行,每<=三個整數ui, vi, wi,表<=有一條從ui到vi,權值為wi的有向邊。

2 <= n <= 300

0 <= m <= n(n <= 1)

1 <= ui, vi <= n

|wi| <= 10^4

僅一行乙個整數,表示點數最小的環上的點數,若圖中不存在負環輸出0。

3 61 2 -2

2 1 1

2 3 -10

3 2 10

3 1 -10

1 3 10

2—————————————————————————

f[i][j][k]=mins(f[i-1][a][c]+f[1][c][b]) 轉移過來

但是這樣其實有點慢 我們可以跑一波倍增來確定答案

#include#include

#include

#include

using

std::min;

const

int m=357

;int

read()

while(c>='

0'&&c<='9')

return ans*f;

} typedef

intmat[m][m];

mat f[

15],ly,now;

intn,m,ans;

bool

pd(mat s)

void mins(int &x,int y)

intmain()

if(!pd(f[8])) return puts("

0"),0

; memset(ly,

0x3f,sizeof

(mat));

for(int i=1;i<=n;i++) ly[i][i]=0

;

for(int i=8;i>=0;i--)

}printf("%d

",ans+1

);

return0;

}

view code

BZOJ4773 負環 二分

233可能我是因為沒看懂倍增的做法才去學的二分做法的,本題我們是要求最小的答案,答案是客觀已經存在的 不像dp,你需要做一些選擇 顯然是滿足單調性的,因此我們可以二分,再利用dfs spfa找負環的方法,我們限制spfa搜尋的層數,不就是限制點數的範圍了嗎?資料小我猜你也卡不了 ac code in...

判斷負環 bzoj 2019

奶 牛們沒錢了,正在找工作。農夫約翰知道後,希望奶牛們四處轉轉,碰碰運氣。而且他還加了一條要求 一頭牛在乙個城市最多只能賺d 1 d 1,000 美元,然後它必須到另一座城市工作。當然,它可以在別處工作一陣後又回來原來的城市再最多賺d美元。而且這樣往往返返的次數沒有限制。城市間有p 1 p 150 ...

毒瘤演算法系列3 負環 倍增Floyed

給定一張邊帶權的無向圖g gg,請你找出乙個點數最少的環,使得環上的邊權和為負數。保證圖中不存在重邊和自環。這道題其實最容易想到的時二分,我們去限制邊的長度,判斷是否存在小於等於這個邊權的負環。但是這麼考慮我們實現最後的判斷,我們可以使用倍增來限制邊權的長度。對於每一次的倍增,我們假設需要判定是否存...