hdu1068 Girls and Boys 二分匹配
题目链接:
二分匹配的应用
求最大独立集
最大独立集等于=顶点数-匹配数
本体中由于男孩和女孩的学号是不分开的,所以匹配数应是求得的匹配数/2
代码:
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 #define maxn 500 7 int g[maxn][maxn]; 8 int vis_x[maxn]; 9 int vis_y[maxn]; 10 int cx[maxn]; 11 int cy[maxn]; 12 int n; 13 int ans; 14 int path(int u) 15 { 16 17 vis_x[u]=1; 18 for(int v=0;v<n;v++) 19 { 20 if(vis_y[v]==0 && g[u][v]!=0) 21 { 22 vis_y[v]=1; 23 24 if(cy[v]==-1 || path(cy[v])) 25 { 26 cx[u]=v; 27 cy[v]=u; 28 return 1; 29 } 30 } 31 } 32 return 0; 33 } 34 void MaxMatch() 35 { 36 memset(cx,-1,sizeof(cx)); 37 memset(cy,-1,sizeof(cy)); 38 39 for(int i=0;i<n;i++) 40 { 41 if(cx[i]==-1) 42 { 43 44 memset(vis_x,0,sizeof(vis_x)); 45 memset(vis_y,0,sizeof(vis_y)); 46 ans+=path(i); 47 } 48 } 49 } 50 int main() 51 { 52 while(scanf("%d",&n)!=EOF) 53 { 54 int id; 55 int num; 56 char c; 57 ans=0; 58 memset(g,0,sizeof(g)); 59 for(int i=0;i<n;i++) 60 { 61 scanf("%d: (%d)", &id,&num); 62 for(int j=0;j<num;j++) 63 { 64 int b; 65 scanf("%d",&b); 66 g[id][b]=1; 67 } 68 } 69 MaxMatch(); 70 cout<<n-ans/2<<endl; 71 72 73 } 74 return 0; 75 }