POJ1466 Girls and Boys【二分图最大独立集】

题目链接:

?id=1466

题目大意:

多少个集合,使得这几个集合之间的学生都没有任何关系。

思路:

集问题。本来应该以男生、女生各一边建二分图求最大独立集,但是这里只有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【二分图最大独立集】

相关文章:

你感兴趣的文章:

标签云: