【學習】Hall’s Marriage Theorem


其實是在做題時遇到這個定理的。
這個定理的圖論意義是:

對於一個二分圖\(G=\{X+Y,E\}\),它滿足:
\(\forall W \subseteq X, \, |W| \leq |N_G(W)|\) \(\iff\)\(X\)中的每個結點都有匹配.
其中\(N_G(W)\)為圖\(G\)中所有與\(W\)相連的結點的集合。

必要性顯然。
對於充分性,不會……以后再補充。

由這個定理,我們能得到一個推論:

二分圖\(G\)的最大匹配\(M\)等於\(|X| - \max (|W| - |N_G(W)|)\).

順便一提,我們允許\(W = \emptyset\),故\(\max (|W| - |N_G(W)|) \geq 0\)
我們分兩步來證明這個推論。在此,我們假設\(W_0 \subseteq X\)滿足\(|W_0| - |N_G(W_0)| = \max (|W| - |N_G(W)|)\)

  • 證明:\(M \leq |X| - \max (|W| - |N_G(W)|)\).
    考慮\(W_0\),即使\(N_G(W_0)\)中的每個結點都與\(W_0\)中的結點匹配,也會有\(|W_0| - |N_G(W_0)|\)個結點得不到匹配。故\(X\)中至少有\(|W_0| - |N_G(W_0)|\)個結點得不到匹配。因此,\(M \leq |X| - \max (|W|)\)
  • 證明:\(M \geq |X| - \max (|W| - |N_G(W)|)\).
    我們在\(Y\)中添加\(\max (|W| - |N_G(W)|\)個結點與\(X\)中所有結點相連得到新圖\(G`\),那么,\(|W_0| - |N_{G`}(W_0)| = 0\)。由Hall‘s Marriage Theorem可知,圖\(G`\)\(X\)的每個元素都有匹配。而對於\(W_0\),因為\(|W_0| = |N_{G`}(W_0)|\),所以\(N_{G`}(W_0)\)中的每個元素都與\(W_0\)中的元素匹配,可得我們新加入的結點都有匹配。因此,除\(W_0\)中有\(|W_0|-|N_G(W_0)|\)個結點與新加入的結點匹配之外,\(X\)中其余結點都與原來\(Y\)中的結點匹配。故在刪去新加的結點后,\(X\)中至多有\(|W_0| - |N_G(W_0)|\)個結點沒有匹配。則\(M \geq |X| - \max (|W| - |N_G(W)|)\)

那么,這個定理及其推論有什么用呢?因為要枚舉\(X\)的所有子集,所以一般是沒什么用的。然而,某些有特殊性質的二分圖的最大匹配問題,會使用這個定理及其推論來轉化問題。

例題

arc076F Exhausted?

題意:給出二分圖\(G=\{X+Y,E\}\)\(X\)中的所有結點滿足:若其編號為\(i\),則只與\(Y\)中編號小於等於\(L_i\)或編號大於等於\(R_i\)的結點連邊。給出\(|X|,|Y|\)和所有的\(L_i,R_i\),求\(G\)的最大匹配\(M\)。(輸出\(|X|-M\))
\(|X|,|Y| \leq 2 \times 10^5\).

有了這個定理,問題就簡單了。我們只要求\(\max (|W| - |N_G(W)|)\)。對於\(W \subseteq X\)\(N_G(W)\)就是形如\(Y - [l,r]\)的形式,其中\([l,r]\)\(Y\)中一個編號的區間。我們枚舉\(r\),用線段樹實現區間加和區間查最大值即可。具體做法不再闡述。
時間復雜度\(O(n \log n)\)

#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int n,m,ans,cnt;
struct data {
  int l,r;
} ordl[N],ordr[N];
bool cmpl(data a,data b) {
  return a.l < b.l;
}
bool cmpr(data a,data b) {
  return  a.r < b.r;
}
struct node {
  int mx,tag;
} t[N << 2];
void puttag(int x,int val) {
  t[x].mx += val;
  t[x].tag += val;
}
void push_down(int x) {
  puttag(x<<1,t[x].tag);
  puttag(x<<1|1,t[x].tag);
  t[x].tag = 0;
}
void push_up(int x) {
  t[x].mx = max(t[x<<1].mx,t[x<<1|1].mx);
}
void modify(int l,int r,int val,int x=1,int lp=1,int rp=m) {
  if (l > rp || r < lp) return;
  if (lp >= l && rp <= r) {
    puttag(x,val);
    return;
  }
  if (t[x].tag) push_down(x);
  int mid = (lp + rp) >> 1;
  modify(l,r,val,x<<1,lp,mid);
  modify(l,r,val,x<<1|1,mid+1,rp);
  push_up(x);
}
int query(int l,int r,int x=1,int lp=1,int rp=m) {
  if (l > rp || r < lp) return 0;
  if (lp >= l && rp <= r) return t[x].mx;
  if (t[x].tag) push_down(x);
  int mid = (lp + rp) >> 1;
  return max(query(l,r,x<<1,lp,mid),query(l,r,x<<1|1,mid+1,rp));
}
int main() {
  int a,b;
  scanf("%d%d",&n,&m);
  ans = max(0,n - m);
  cnt = n;
  for (int i = 1 ; i <= cnt ; ++ i) {
    scanf("%d%d",&a,&b);
    a ++;
    b --;
    if (a > b) {
      i --, cnt --;
      continue;
    }
    ordl[i] = (data) {a,b};
    ordr[i] = (data) {a,b};
  }
  sort(ordl+1,ordl+cnt+1,cmpl);
  sort(ordr+1,ordr+cnt+1,cmpr);
  int pl = 1, pr = 1;
  for (int i = 1 ; i <= m ; ++ i) {
    modify(1,i,1);
    for (; ordl[pl].l <= i && pl <= cnt ; ++ pl)
      modify(ordl[pl].l,m,1);
    ans = max(ans,query(1,i) - m);
    for (; ordr[pr].r <= i && pr <= cnt ; ++ pr)
      modify(ordr[pr].l,m,-1);
  }
  printf("%d\n",ans);
  return 0;
}

小結:學了一個沒卵用的定理。也挺好奇還有哪些二分圖能用到這個定理。

upd 2018.12.26

假如\(G\)滿足,\(X\)中的每一個結點與\(Y\)中一個區間內的結點連邊,即\(\forall a \in X, N_G(a) = [l_a,r_a]\)

定義對於\(Y\)中的一個編號區間\([l,r]\)\(f([l,r])\)\(X\)中只與\([l,r]\)中點連邊的點構成的集合,即\(\{ a \in X \ | \ N_G(a) \subseteq [l,r] \}\)

求證:

\[\forall [l,r] \subseteq Y, |f([l,r])| \leq |[l,r]| \iff \forall W \subseteq X, |W| \leq |N_G(W)| \]

證明:

  • 必要性。令\(W = f([l,r])\),那顯然有\(N_G(W) \subseteq [l,r]\)。因此,\(|f([l,r])| = |W| \leq |N_G(W)| \leq |[l,r]|\)
  • 充分性。考慮任意一個\(W \subseteq X\),那么\(N_G(W)= \bigcup_{a \in W} [l_a,r_a]\)。那么,\(N_G(W)\)就一定可以被表示為若干個互不相交的區間的並。因為每個\(X\)中的結點都只和一個區間內的點連邊,所以我們可以把\(W\)划分為若干個集合,其中每個集合對應\(N_G(W)\)中的一段區間。對於我們划分出來的任意一個集合,假如它對應的區間為\([l,r]\),那這個集合就一定是\(f([l,r])\)的子集。因此,對於\(W\)划分出來的每一集合\(S\)都滿足\(|S| \leq |N_G(S)|\),故\(W\)也滿足\(|W| \leq |N_G(W)|\)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM