hihocoder 1127 : 二分图三·二分图最小点覆盖和最大独立集
生活随笔
收集整理的這篇文章主要介紹了
hihocoder 1127 : 二分图三·二分图最小点覆盖和最大独立集
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最大獨立集問題:
在圖G中選取盡可能多的點,使得任意兩個點之間沒有連邊。
結論:最大獨立集的點數 = 總點數 - 二分圖最大匹配
證明:
假設最大獨立集的點數為|U|,二分圖最大匹配的匹配數為|M|,最大匹配中所有頂點集合為EM
先證明 |U|≤|V|-|M|
M中任意一條邊的兩個端點是連接的,所有對于M中的邊必有一個端點不在|U|集合中,所以|M|≤|V|-|U|
再證明|U|≥|V|-|M|
首先我們知道一定有|U|≥|V|-|EM|,即將最大匹配的點刪除之后,剩下的點一定都不相連。
接下來我們考慮能否將M集合中的一個端點放入U中:
假設(x,y)屬于M,存在(a,x),(b,y),且a,b都在U中,則會出現兩種情況:
- 如果(a,b)連接,則有一個更大的匹配存在,矛盾
- 如果(a,b)不連接,a->x->y->b有一個新的增廣路,因此有一個更大的匹配,矛盾
故有a,b兩點中至多只有1個點屬于U,則我們總是可以選取x,y中一個點放入集合U
所以|U|≥|V|-|EM|+|M|=|V|-|M|
綜上有|U|=|V|-|M|
最小點覆蓋問題:
在圖G中選取盡可能少的點,使得圖中每一條邊至少有一個端點被選中。即用最少的點去覆蓋所有的邊。
結論:最小點覆蓋的點數 = 二分圖最大匹配
其實最小點覆蓋的點數=二分圖最大匹配這個結論可以很直觀地感受,假設最小點集合里面的一個頂點為V,那么與V相鄰的邊都能夠被它給覆蓋掉,那么與這條邊對應的另一端頂點就不需要考慮了,并且在最大匹配的點集合中,必定有一半的點所關連的邊不止一條。所以可以很直觀地得到這個結論。
#include<iostream> #include<cstdio> #include<cstring> using namespace std;const int maxn = 1001; int n,m,belong[maxn]; bool vis[maxn],line[maxn][maxn];bool find(int x) {for(int i = 1; i <= n; i++){if(line[x][i] == true && vis[i] == false){vis[i] = true;if(belong[i] == 0 || find(belong[i]) == true){belong[i] = x;return true;}}}return false; }int main() { while(scanf("%d%d",&n,&m)!=EOF){for(int i = 1; i <= m; i++){int u,v;scanf("%d%d",&u,&v);line[u][v] = line[v][u] = true;}int ans = 0;for(int i = 1; i <= n; i++){memset(vis,false,sizeof(vis));if(find(i)) ans++;}printf("%d\n%d\n",ans/2,n-ans/2);}return 0; }
總結
以上是生活随笔為你收集整理的hihocoder 1127 : 二分图三·二分图最小点覆盖和最大独立集的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hihocoder 1122 : 二分图
- 下一篇: 绿色日期控件皮肤 My97 DatePi