ZJOI 2011 最小割 分治

2022-04-29 23:21:11 字數 2546 閱讀 3322

題目鏈結:bzoj點我:-)

洛谷點我:-)

題目描述

小白在圖論課上學到了乙個新的概念——最小割,下課後小白在筆記本上寫下了如下這段話: 」對於乙個圖,某個對圖中結點的劃分將圖中所有結點分成兩個部分,如果結點s,t不在同乙個部分中,則稱這個劃分是關於s,t的割。

對於帶權圖來說,將所有頂點處在不同部分的邊的權值相加所得到的值定義為這個割的容量,而s,t的最小割指的是在關於s,t的割中容量最小的割「

現給定一張無向圖,小白有若干個形如」圖中有多少對點它們的最小割的容量不超過x呢「的疑問,小藍雖然很想回答這些問題,但小藍最近忙著挖木塊,於是作為仍然是小藍的好友,你又有任務了。

輸入格式

輸入檔案第一行有且只有乙個正整數t,表示測試資料的組數。 對於每組測試資料, 第一行包含兩個整數n,m,表示圖的點數和邊數。 下面m行,每行3個正整數u,v,c(1<=u,v<=n,0<=c<=10

6),表示有一條權為c的無向邊(u,v) 接下來一行,包含乙個整數q,表示詢問的個數 下面q行,每行乙個整數x,其含義同題目描述。

輸出格式

對於每組測試資料,輸出應包括q行,第i行表示第i個問題的答案。對於點對(p,q)和(q,p),只統計一次(見樣例)。兩組測試資料之間用空行隔開。

思路

最小割樹的裸題。(入門的講解)

最小割樹性質:若不考慮多個最小割的情況,設s1-t1的最小割割集為c1,s2-t2的最小割割集為c2,則c1,c2必然不會相互跨立,這個結論可通過反證法得到(下方)。

它們構成了一棵最小割樹,每次挑兩個點算mincut分成兩個集合分治算即可,最小割數目不超過n−1

所以dinic+分治,但是isap不知道為什麼re了(爆棧?)。。

最小割樹的證明:

我們令1和4的最小割是a,b,2和3的最小割是c,d,並且它們相互跨立(如上圖)

那麼a,c也是1和4的乙個割,所以c > b

b,d也是1和4的乙個割,所以d > a

所以c > b並且d > a,那麼2和3的最小割就是a,b而不是c,d了,矛盾

證畢感想

又一次深夜刷的題。。昨天1點多鐘還在wa,整個人都不好了,早上發現。。居然忘了在跟新答案時賦成雙向。(論剛開始連題目都沒看懂並且不知道割是什麼的我。。好吧割集是刪掉這個集合中的任意一條邊,會使那兩個點不聯通)

終於又有動力做題了,終於知道看到別人刷題記錄時的強大動力了》-<

**

1

//miaomiao 2017.2.8

2 #include3 #include4 #include5 #include6 #include7

8using

namespace

std;910

#define set(a, v) memset(a, v, sizeof(a))

11#define for(i, a, b) for(int i = (a); i <= (int)(b); i++)

1213

#define n (150+5)

14#define m (6000+5)

15#define inf 0x3f3f3f3f

1617

struct

dinic

22void clearflow()

23void addedge(int u, int v, int

w)27

28bool

bfs()37}

38return

d[t];39}

4041

int dfs(int now, int

minf)51}

52return

ret;53}

5455

int mincut(int ss, int

tt)62

return

ret;63}

64}din;

6566

intn, cut[n][n], id[n], tmp[n];

6768

void solve(int l, int

r)79

80int

main()

9192 for(i, 1, n) id[i] =i;

93 set(cut, inf); solve(1

, n);

9495 scanf("

%d", &q);

96while(q--)

101102

if(t) puts(""

);103

}104

105return0;

106 }

ZJOI 2011 最小割 分治

小白在圖論課上學到了乙個新的概念 最小割,下課後小白在筆記本上寫下了如下這段話 對於乙個圖,某個對圖中結點的劃分將圖中所有結點分成兩個部分,如果結點s,t不在同乙個部分中,則稱這個劃分是關於s,t的割。對於帶權圖來說,將所有頂點處在不同部分的邊的權值相加所得到的值定義為這個割的容量,而s,t的最小割...

ZJOI2011 營救皮卡丘

題面 神仙題。做最小路徑覆蓋。有乙個很像的地方,就是最小路徑覆蓋必須覆蓋到每個點,這道題也一樣。這道題有4個和最小路徑覆蓋不一樣的地方 可以重複訪問 這個可以用 floyed 傳遞閉包解決 每條路徑必須從原點出發 每個點必須被 到達 並不能乙個節點成乙個路徑 假設已經訪問了 1.x 那麼至少有乙個人...

ZJOI2011 營救皮卡丘

似乎這玩意兒叫做 k 路徑覆蓋問題 可以發現 k 個人每個人走過的點集不相交 就是有 n 個點 m 條邊的圖,邊有邊權,從 0 出發,中途如果經過點 u 那麼之前必須經過點 u 1 可以從點 s 出發最多 k 次,問走到 n 的最小花費 那麼題目就轉化成了用不超過 k 條不相交的鏈覆蓋整張圖的最小代...