题意:n个男孩相互认识,m个女孩相互认识,k对男孩和女孩相互认识,求最大的任意两人相互认识的集合;
思路:二分图匹配;
独立集=总数-最大匹配数;
最大团=原图补图的最大独立集=总数-补图的最大匹配数;
本题就是求最大团,先求补图的最大匹配数,匈牙利算法;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int t,n,m; int mm[505][505]; int vis[500010],link[500010]; int dfs(int x) { for(int i=1;i<=m;i++) { if(!vis[i]&&mm[x][i]) { vis[i]=1; if(link[i]==-1||dfs(link[i])) { link[i]=x; return 1; } } } return 0; } int hungary() { int sum=0; memset(link,-1,sizeof(link)); for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) sum++; } return sum; } int main() { int i,j,k,u,v,cas=0; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { if(n==0&&m==0&&k==0) break; cas++; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { mm[i][j]=1; } } for(i=0;i<k;i++) { scanf("%d%d",&u,&v); mm[u][v]=0; } printf("Case %d: %d\n",cas,n+m-hungary()); } return 0; }
时间: 2024-11-11 00:52:41