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

2021-10-06 22:38:06 字數 2185 閱讀 2835

給定一張n

nn個點、m

mm條邊的無向圖,點從1

11開始編號,保證所有點的度數都不超過333。

現在假定每條邊的容量都為1

11,請你求出任意兩點間的最大流,最後只要輸出所有點對(i,j

i,ji,

j)(i

i<

j)間最大流的和。

對於這道題目,突破口便在於任意點的度數不超過333.

最大流的定義:兩點間最多能流過多少條路徑。

最小割的定義:最少割幾條邊能夠使兩點分開。

根據最大流=最小割可知,我們只要求解任意兩點的最小割即可。那麼我們應該如何求解呢?觀察到任意點的度數不超過3

33,那麼就有任意兩點間的最小割不超過3。

那麼這樣,我們的瓶頸就在於如何求解兩點間的最小割是2

22的情況,我們可以列舉每一條邊後得到每乙個點的邊雙編號,我們對這些編號進行雜湊儲存,這樣我們在最後列舉的時候就可以做到o(1

)o(1)

o(1)

判斷了。

總複雜度:o(n

2)

o(n^2)

o(n2

)

#include

#define int long long

using

namespace std;

const

int n =

3000+32

;int n, m, tot =

1, cnt, delx, dely;

int low[n]

, dfn[n]

, link[n]

, fa[n]

, br[n *6]

, res1[n]

, res2[n]

;unsigned

long

long res3[n]

;struct node e[n *6]

;int

read

(void

)void

clear

(void

)void

add(

int x,

int y)

; link[x]

= tot;

}void

tarjan

(int x,

int last)

else

if(i !=

(last ^1)

) low[x]

=min

(low[x]

,dfn[y]);

}return;}

intget

(int x)

void

merge

(int x,

int y)

void

work

(void

)for

(int i=

2;i<=tot;i+=2

)for

(int i=

1;i<=n;

++i)

res3[i]

= res3[i]

*13331

+get

(i);

return;}

signed

main

(void

)for

(int i=

1;i<=n;

++i) res1[i]

=get

(fa[i]);

work()

;for

(int i=

1;i<=n;

++i) res2[i]

=get

(fa[i]);

memset

(res3,0,

sizeof res3)

;for

(int i=

2;i<=tot;i+=2

)int res =0;

for(

int i=

1;i<=n;

++i)

for(

int j=i+

1;j<=n;

++j)

cout << res << endl;

return0;

}

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

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

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

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

java演算法系列

棧的概念 棧是一種特殊的線性表,堆疊的資料元素以及資料元素之間的關係和線性表是完全一樣的。差別是線性表是在任意位置進行插入和刪除操作,棧是只允許在固定的一端進行插入和刪除,棧的插入和刪除只允許在棧頂,棧的插入和刪除通常稱為進棧和出棧。資料集合 每個資料元素的資料型別可以是任意的型別 操作的集合 進棧...