在二分圖中,找出乙個最小的點集,使之覆蓋所有的邊,這個問題被稱為二分圖的最小點覆蓋。
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.我們任取乙個最大匹配,將在最大匹配內的點染成藍色,不在最大匹配內的點染成黑色 顯然,不可能有邊的兩個端點都是黑色,也就是說每條邊都至少有乙個藍色點.我們只需選擇藍色點即可,考慮在每條匹配邊中只選乙個藍點。選擇藍...