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