标签:
题目链接:
http://poj.org/problem?id=1466
题目大意:
有N个学生,他们之间的某些人比较暧昧,只有认识的人能组成一个集合。问:最多能组成
多少个集合,使得这几个集合之间的学生都没有任何关系。
思路:
从N个图中选出M个点,使得这M个点两两之间没有边,求最大的M是多少。二分图最大独立
集问题。本来应该以男生、女生各一边建二分图求最大独立集,但是这里只有N个点,没有告
诉男生、女生的编号。那么以N个学生为一边、再以N个学生为另一边。将相互联系的人之间
建边。然后求最大匹配数。因为如果u和v有联系的话,边(u,v)和(v,u)都加入了二分图中,
被重复计算了两遍。又因为二分图最大独立集 = N - 二分图最大匹配数。所以最终答案就是
N - 最大匹配数/2。
AC代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int MAXN = 550; bool Map[MAXN][MAXN]; bool Mask[MAXN]; int NX,NY; int cx[MAXN],cy[MAXN]; int FindPath(int u) { for(int i = 0; i < NX; ++i) { if(Map[u][i] && !Mask[i]) { Mask[i] = 1; if(cy[i] == -1 || FindPath(cy[i])) { cy[i] = u; cx[u] = i; return 1; } } } return 0; } int MaxMatch() { for(int i = 0; i < NX; ++i) cx[i] = -1; for(int i = 0; i < NY; ++i) cy[i] = -1; int res = 0; for(int i = 0; i < NX; ++i) { if(cx[i] == -1) { for(int j = 0; j < NY; ++j) Mask[j] = 0; res += FindPath(i); } } return res; } int main() { int N,K,u,v; while(~scanf("%d",&N)) { memset(Map,0,sizeof(Map)); NX = NY = N; for(int i = 0; i < N; ++i) { scanf("%d: (%d)",&u,&K); for(int j = 0; j < K; ++j) { scanf("%d",&v); Map[u][v] = 1; Map[v][u] = 1; } } printf("%d\n",N-MaxMatch()/2); } return 0; }
POJ1466 Girls and Boys【二分图最大独立集】
标签:
原文地址:http://blog.csdn.net/lianai911/article/details/44814893