最小點覆蓋 最大獨立集

2022-07-23 04:36:09 字數 1545 閱讀 4005

在二分圖中,找出乙個最小的點集,使之覆蓋所有的邊,這個問題被稱為二分圖的最小點覆蓋。

könig定理:

二分圖最小點覆蓋包含的點數等於這個二分圖的最大匹配數。

證明:

1.求出二分圖的最大匹配,定義:匹配邊為包含在最大匹配裡的邊,匹配點為與匹配邊相連的點。

2.從二分圖右部的非匹配點開始,按照:非匹配邊->匹配邊->非匹配邊......(交錯路)依次將遍歷到的結點打上標記。

3.選取左部標記點和右部未標記點即可構成最小點覆蓋。

證明懶得寫了

二分圖最小點覆蓋模型特點(「2要素」):每個邊有兩個端點,兩個端點任選其一即可。

題目:poj 2226

題解:顯而易見:木板越長越好。

對於乙個泥地,要麼被橫著的木板擋住,要麼被豎著的木板擋住。先預處理擋住每個泥地木板編號,將橫著的木板作為右部結點,豎著的作為左部端點,連邊求出最小點覆蓋即為答案。

#include #include #include #include #include using namespace std;

const int n = 2505;

const int m = 5000;

int n, m, map[n][n], tot = 0, match[m], tot1 = 0;

int head[n], nextt[m << 1], to[m << 1], cnt = 0;

void add(int x, int y)

struct node e[n][n];

bool vis[m];

bool dfs(int x)

} return false;

}int main()

} tot = 1;

for(int i = 1; i <= n; i++) else

if(j > m) tot++;

}} }

tot1 = 1;

for(int j = 1; j <= m; j++) else

if(i > n) tot1++;

}} }

int ans = 0;

for(int i = 1; i <= n; i++)

} for(int i = 1; i <= tot1; i++)

printf("%d", ans);

return 0;

}

在二分圖中,找出最大的點集,使其中任意兩個點都沒有邊直接相連,這個點集就是最大獨立集

最大獨立集 = 點數 - 最大匹配

證明:

顯然。選取最多的點構成獨立集 <==> 用最少的點覆蓋邊,總點數去掉最小點覆蓋後剩下的點之間沒有邊直接相連

證畢。題目:p3355 騎士共存問題

題解:對棋盤進行黑白染色,分成兩部分作為左右部結點,能互相攻擊到的格仔之間連邊(觀察可知,一種顏色的格仔無法攻擊和它顏色相同的格仔,所以連完邊後構成一張二分圖)求出最大獨立集即為答案。

最小路徑覆蓋,最小點覆蓋,最大獨立點集

node 1 最小路徑覆蓋 在乙個 的有向圖中,路徑覆蓋就是在圖中找一些路經,使之覆蓋了圖中的所有頂點,且任何乙個頂點有且只有一條路徑與之關聯 如果把這些路徑中的每條路徑從它的起始點走到它的終點,那麼恰好可以經過圖中的每個頂點一次且僅一次 如果不考慮圖中存在迴路,那麼每條路徑就是乙個弱連通子集 由上...

最小點權覆蓋和最大點權獨立集

1 最小點權覆蓋與最大點權獨立集 定義 二分圖又稱作二部圖,是圖論中的一種特殊模型。設 g v,e 是乙個無向圖,如果頂點 v 可分割為兩個互不相交的子集 a,b 並且圖中的每條邊 i,j 所關聯的兩個頂點i和j分別屬於這兩個不同的頂點集 i in a,j in b 則稱圖g為乙個二分圖。給定乙個二...

最小點覆蓋 最大匹配證明

1.最大匹配裡的邊,每一條邊都需要使用頂點覆蓋,也就是說最小點覆蓋大於等於最大匹配數 2.我們任取乙個最大匹配,將在最大匹配內的點染成藍色,不在最大匹配內的點染成黑色 顯然,不可能有邊的兩個端點都是黑色,也就是說每條邊都至少有乙個藍色點.我們只需選擇藍色點即可,考慮在每條匹配邊中只選乙個藍點。選擇藍...