hdu 1068 Girls and Boys 最大独立集(最大匹配)

来源:互联网 发布:虎扑认证淘宝店 编辑:程序博客网 时间:2024/05/25 23:59
#include <cstdio>#include <cstring>#include <vector>#include <algorithm>#include <iostream>using namespace std;const int maxn=1010;vector<int>e[maxn];int vis[maxn],pre[maxn];int find(int u)//判断增广路是否存在 {int i,j,v;for(i=0;i<e[u].size();i++){v=e[u][i];if(!vis[v]){vis[v]=1;if(pre[v]==-1||find(pre[v])){pre[v]=u;return 1;}}}return 0;}int main(){int n;while(scanf("%d",&n)!=EOF){int i,j,k,a,b,c,m;for(i=0;i<n;i++)e[i].clear();for(i=0;i<n;i++){scanf("%d: (%d)",&a,&m);for(j=0;j<m;j++){scanf("%d",&b);e[a].push_back(b);e[b].push_back(a);}}int ans=0;memset(pre,-1,sizeof(pre));for(i=0;i<n;i++){memset(vis,0,sizeof(vis));ans+=find(i);}printf("%d\n",n-ans/2);}return 0;}/*最大匹配:在图G中,找出边数最多的子图M,使得M中每条边都没有公共顶点。则M就是G的最大匹配最大独立集:在图G中,找出点数最多的子图M,使得M中的各个点都不相连,则M为G的最大独立集匈牙利算法:求通过计算增广路数最大匹配二分图中:最大独立集的基数=顶点数n-最大匹配数这种方法需要记录的边必须是二分图中左边顶点集到右边顶点集。二分图种:最大独立集的基数=顶点数n-最大匹配数/2这种方法是记录的边是既有左边顶点集到右边顶点集,也有右边顶点集到左边顶点集。相当于重复了一次,所以最大匹配数需要除以2; */

原创粉丝点击