1. 程式人生 > >圖論知識記錄

圖論知識記錄

集合 算法 math 一個 || 部分 不能 增廣路 取反

二分圖相關


二分圖,兩個等價定義:沒有奇環的圖 / 可以黑白染色的圖

證明:

充分性證明:如果一張圖沒有奇環,那麽它可以黑白染色

考慮反證,如果它不能黑白染色,那麽存在奇環

一定存在一條邊\((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\)

不存在增廣路,因此最終停止的節點一定和\(u\)屬於同一部分,記做\(u_1\)

但是在\(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;
}

獨立集:點形成的子集,這些點沒有公共邊

:點形成的子集,這些點兩兩有連邊

覆蓋:點形成的子集,每條邊至少有一個端點入選

支配集:點形成的子集,每個點至少有一條邊與集合相連或者在集合中

圖論知識記錄