1. 程式人生 > >標簽 OI考點梳理

標簽 OI考點梳理

define hms 最小 memset += 路徑 歷程 network 求解

個人相關


  總結.

  OI歷程.

題目


  基礎題.

  綜合題.

  原創題.

考點


  註意是考點不是知識點, 知識點才沒有這麽散亂呢QAQ.

  線性代數.

    行列式求值.

    Matrix-tree定理.

    Lindstrom-Gessel-Viennot引理.

    高斯消元.

    線性基.

    特征值.

    矩陣乘法.

  數論.

    

## **一、參考資料**<https://blog.sengxian.com/algorithms/networkflow-variants><http://www.matrix67.com/blog/archives/116><http://dsqiu.iteye.com/blog/1689505>
## **二、匹配,邊覆蓋,獨立集,點覆蓋之間的三組關系及原理**### **(一)最大匹配與最小邊覆蓋**&emsp;&emsp;對於任意連通圖,有: $$|M_\max|+|F_\min|=|V|$$ &emsp;&emsp;用中文描述就是: $最大匹配數+最小邊覆蓋數=頂點數$
**證明:**&emsp;&emsp;若在邊覆蓋集中新增一條邊,則有三種情況:① 當邊的兩端都被覆蓋時,多覆蓋了 $0$ 個點② 當邊一端覆蓋一端未覆蓋時,多覆蓋了 $1$ 個點③ 當邊的兩端都未被覆蓋時,多覆蓋了 $2$ 個點
&emsp;&emsp;由於我們要用最小的邊,覆蓋所有的 $n$ 個點,所以每次覆蓋的邊肯定越多越好。&emsp;&emsp;能覆蓋 $2$ 個點的邊就是最大匹配,接下來,對於每個沒有被覆蓋的點,找到一條它與被覆蓋的點的連邊,把這條邊連起來就好了。
&emsp;&emsp;所以 $|F_\min|=(|V|-2*|M_\max|)+|M_\max|$ &emsp;&emsp;所以 $|M_\max|+|F_\max|=|V|$
### **(二)最大獨立集與最小點覆蓋的關系**&emsp;&emsp;對於任意圖,有:$$S_\max\cup S_\min=V$$&emsp;&emsp;數量化之後,有$$|S_\max|+|S_\min|=|V|$$&emsp;&emsp;用中文描述就是:在點集 $V$ 中,最大獨立集 $S_\max$ 與最小點覆蓋 $S_\min$ 互補
**證明:**&emsp;&emsp;對於一個獨立集 $P$ ,設它在 $V$ 中的補集為 $Q$ 。&emsp;&emsp;根據獨立集的定義, $P$ 中的節點兩兩不相鄰,所以與 $P$ 中節點相連的邊對應的節點一定在補集 $Q$ 中。而還有一種類型的邊,就是兩個點都在補集 $Q$ 中。&emsp;&emsp;所以,對於每條邊,它一定至少有一個端點在補集 $Q$ 中,即 $Q$ 是一個點覆蓋集。&emsp;&emsp;所以對於任意一個獨立集,**有且僅有**一個點覆蓋集與其互補。&emsp;&emsp;所以當且僅當獨立集為最大獨立集時,最大獨立集的補集為最小點覆蓋。
### **(三)二分圖中最大匹配與最小點覆蓋的關系(K?nig定理)****K?nig定理:**在二分圖中,有$$|M_\max|=|S_\min|$$用中文描述就是,最大匹配數=最小點覆蓋數
**證明:**&emsp;&emsp;首先提出構造方法。&emsp;&emsp;進行二分圖最大匹配,對於右端所有沒被匹配的點,找增廣路,將點進行標記。&emsp;&emsp;最小點覆蓋為左端所有被標記的點,和右端所有未被標記的點。
&emsp;&emsp;**為什麽點的個數等於最大匹配數?**這是因為,在我們選取的點集中,每個點都在一個匹配上,且每個匹配上只有一個點集上的點。即:最大匹配上的每一條邊有且僅有一個點集中的點。
&emsp;&emsp;**為什麽點集為點覆蓋集?**即證明:不存在一條邊,左邊的點為被標記,右邊的點被標記。&emsp;&emsp;假設存在一條邊,左邊的點為被標記,右邊的點被標記,分類討論:當這條邊是匹配邊時,必然是從左走到右,既然左邊沒有被標記,那麽右邊也不能被標記;當這條邊未被匹配時,必然是從右走到左,既然右邊被標記了,那麽就可以走到左邊啊。所以不存在。
&emsp;&emsp;**為什麽點覆蓋集最小?**&emsp;&emsp;這是因為,我們既然有了最大匹配的邊數$M$,則至少有$2M$個點,所以至少要用$M$個點來覆蓋。所以取到了下限。
&emsp;&emsp;綜上,有 $|F_\max|=|S_\min|$
## **三、二分圖最大匹配****【構造方法】【計數方法】**Hungary算法```c++#define rep(i,a,b) for (int i=(a);i<=(b);i++)
int mp[N][N];int used[N],att[N];int res;
int Hungary(int x) {rep(nx,1,n)if (!used[nx]&&mp[x][nx]) {used[nx]=1;if (!att[nx]||Hungary(att[nx])) {att[nx]=x;return 1;}}return 0;}
void Match(void) {rep(i,1,n) {memset(used,0,sizeof used);Hungary(i);}res=0;rep(i,1,n)res+=(att[i]>0);printf("%d\n",res);}```
## **四、二分圖最小邊覆蓋****【計數方法】** $|F_\min|=|V|-|M_\max|$ ,只需要求二分圖最大匹配即可;**【構造方法】**① 求二分圖最大匹配,最大匹配的邊全部都要取② 然後對於沒有被匹配的點,選取一條它與被匹配的點相連的邊
## **五、二分圖最小點覆蓋****【計數方法】** $|S_\min|=|M_\max|$**【構造方法】**① 二分圖最大匹配② 對於右邊所有沒有被匹配的點,嘗試找增廣路,把遍歷的點進行標記③ 點覆蓋集為:左邊被標記的點+右邊未被標記的點
## **六、二分圖最大獨立集****【計數方法】** $|S_\max|=|V|-|S_\min|=|V|-|M_\max|$**【構造方法】**求出最小點覆蓋,取補集。
## **七、二分圖最大團****【計數方法】** $最大團的大小=補圖的最大獨立集$**【構造方法】** 補圖的最大獨立集
## **八、最小路徑覆蓋問題****【定義】**在圖 $G$ 中,用最少的路徑覆蓋所有的點為了方便表示,記最小路徑覆蓋數為 $T_\min$
**【建模】**在圖 $G$ 中,將每個點 $i$ 拆成兩個點 $x_i,y_i$ ,構成二分圖,若 $(u,v)\in E$ ,則把 $x_u$ 向 $y_v$ 連接一條邊。若要求路徑不交叉,則直接連接;若路徑可以交叉,則應該先用Floyd求解傳遞閉包。**【計數方法】** $$|T_\min|=|V|-|M_\max|$$ **【構造方法】**&emsp;&emsp;進行二分圖最大匹配,若 $x_u$ 向 $y_v$ 連接了一條邊,說明有 $u->v$ 的路徑。

標簽 OI考點梳理