給定一張邊帶權的無向圖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.最大流的定義 兩點...