圖論知識記錄
二分圖相關
二分圖,兩個等價定義:沒有奇環的圖 / 可以黑白染色的圖
證明:
充分性證明:如果一張圖沒有奇環,那麽它可以黑白染色
考慮反證,如果它不能黑白染色,那麽存在奇環
一定存在一條邊\((u, v)\),使得\(u, v\)同時為白色
\((u, v)\)一定在環中,如果不在,考慮\(dfs\)構造,那麽\((u, v)\)不可能是同一顏色
如果\((u, v)\)所在環是一個偶環,那麽取反\(u\)後,原圖合法,不符合無法染色的條件
因此,\((u, v)\)所在環一定是一個奇環
必要性證明:如果一張圖可以黑白染色,那麽它沒有奇環
考慮逆否命題,如果它有奇環,那麽它一定不能黑白染色
單獨考慮這個奇環,設其中一點顏色為白,那麽繞著奇環走一圈,會經過奇數條邊回到它自身,此時它必須是黑色才能滿足條件
這不可能,因此必要性成立
匹配:邊形成的子集,這些邊沒有公共頂點
匈牙利算法
在匹配中的邊稱為匹配邊,其余邊稱為非匹配邊
和匹配邊相鄰匹配點,否則稱為非匹配點
交錯路:匹配邊和非匹配邊彼此相間的道路
增廣路:兩端都為非匹配點的交錯路
取反交錯路後,匹配數不會變少
取反增廣路後,匹配數會 + 1
增廣路引理:如果從一個未匹配點出發找不到增廣路,那麽存在一個最大匹配,這個最大匹配不包含這個點
(某大佬說它需要一個名字
證明:
考慮構造一個匹配\(M\),這個\(M\)中存在一個未匹配點\(u\),\(u\)沒有增廣路
假設這張圖的一個最大匹配為\(M'\)
那麽,如果\(u\)不在\(M'\)
如果\(u\)在\(M'\)中是匹配點,那麽設\(u\)的匹配點為\(v\)
考慮\(v\),如果\(v\)的出邊中有一條連向非匹配點,那麽取反這條交錯路,得證
否則,因為\(u\)在\(M\)中沒有增廣路,因此\(v\)在\(M\)中有匹配點\(u'\),且\(u'\)在\(M'\)中也是匹配點
考慮\(u'\),如果\(u'\)的出邊中有非匹配點,那麽存在增廣路,\(M\)不是最大匹配
否則,考慮\(u'\)在\(M'\)中的匹配點\(v'\).....
依次類推
如果沒有在中間找到一條交錯路
由於\(u\)
但是在\(M'\)中,\(u\)到\(u_1\)形成了一條增廣路,這不可能
因此,一定會在中間的過程中找到一條交錯路,使得交錯之後的最大匹配\(M_1\)不含\(u\)
增廣路定理:如果圖上不存在增廣路,當且僅當匹配為最大匹配
證明:
必要性證明:如果原圖為最大匹配,那麽圖上不存在增廣路
如果有增廣路,那麽匹配可以+1,不符合最大匹配
充分性證明:如果圖上不存在增廣路,那麽原圖為最大匹配
對於所有的未匹配點而言,都找不到增廣路,對它們依次使用增廣路引理
最終,剩下的點只含匹配點,且根據增廣路引理,它是最大匹配
算法
根據增廣路引理,我們知道:
如果從一個點出發找不到增廣路,那麽刪除它仍然有最大匹配
因此,我們可以考慮對每個點依次嘗試尋找增廣路,如果一個點找到了增廣路,那麽最大匹配+1
bool dfs(int o) {
for(int i = cap[o]; i; i = nxt[i]) {
int cur = node[i];
if(!vis[cur]) {
vis[cur] = 1;
if(!mat[cur] || dfs(mst[cur]))
{ mat[cur] = o; return 1; }
}
}
return 0;
}
int Match() {
int ret = 0;
for(int i = 1; i <= n; i ++)
ret += dfs(i);
return ret;
}
獨立集:點形成的子集,這些點沒有公共邊
團:點形成的子集,這些點兩兩有連邊
覆蓋:點形成的子集,每條邊至少有一個端點入選
支配集:點形成的子集,每個點至少有一條邊與集合相連或者在集合中
圖論知識記錄