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

2021-10-05 23:23:02 字數 1531 閱讀 3606

給定一張邊帶權的無向圖g

gg,請你找出乙個點數最少的環,使得環上的邊權和為負數。保證圖中不存在重邊和自環。

這道題其實最容易想到的時二分,我們去限制邊的長度,判斷是否存在小於等於這個邊權的負環。但是這麼考慮我們實現最後的判斷,我們可以使用倍增來限制邊權的長度。

對於每一次的倍增,我們假設需要判定是否存在邊權小於等於2

i2^i

2i的環,那麼我們模擬樹上倍增的演算法,可以大致得到以下演算法:

現在我們考慮如何實現這樣的倍增演算法:

但是我們發現這並不具有單調性,即:走的步數多的,最短路徑不一定比走的步數少的要短。因此我們我們可以對每乙個點新增自環,這樣的話一定存在步數多的權值=步數少的權值的狀況,那麼就具有單調性了。

這樣我們可以重新f(i

,j

)f(i,j)

f(i,j)

的含義:

#include

using

namespace std;

const

int k =15;

const

int n =

305;

int n, m;

int res =0;

int a[k]

[n][n]

, g[n]

[n], f[n]

[n];

intread

(void

)int

main

(void

)for

(int i =

1; i <= n;

++i) a[0]

[i][i]=0

;for

(int t =

1; t <=10;

++t)

for(

int k =

1; k <= n;

++k)

for(

int i =

1; i <= n;

++i)

for(

int j =

1; j <= n;

++j) a[t]

[i][j]

=min

(a[t]

[i][j]

, a[t -1]

[i][k]

+ a[t -1]

[k][j]);

for(

int i =

1; i <= n;

++i) f[i]

[i]=0;

for(

int t =

9; t >=0;

--t)

if(tag ==0)

}if(res >= n)

cout <<

"0\n"

;else

cout << res +

1<< endl;

}

毒瘤演算法系列13 情報傳遞

有乙個情報網共有n nn個人,通過有向的 線聯絡。為保證通訊安全,需要滿足一些要求,這些要求分為兩類 現在作為總工程師的你需要構造乙個合法的情報網,使得這個情報網滿足給定要求,或者告訴情報機構這樣的情報網是不存在的。這道題a aa如果到b bb的情況一定滿足的話,一定要在滿足這對條件的情況下,其它對...

演算法系列3《SHA》

sha是一種資料加密演算法,該演算法經過加密專家多年來的發展和改進已日益完善,現在已成為公認的最安全的雜湊演算法之一,並被廣泛使用。該演算法的思想是接收一段明文,然後以一種不可逆的方式將它轉換成一段 通常更小 密文,也可以簡單的理解為取一串輸入碼 稱為預對映或資訊 並把它們轉化為長度較短 位數固定的...

毒瘤演算法系列12 最大流 邊雙連通分量 雜湊

給定一張n nn個點 m mm條邊的無向圖,點從1 11開始編號,保證所有點的度數都不超過333。現在假定每條邊的容量都為1 11,請你求出任意兩點間的最大流,最後只要輸出所有點對 i,j i,ji,j i i j 間最大流的和。對於這道題目,突破口便在於任意點的度數不超過333.最大流的定義 兩點...