有男生女生,男生都认识双方,女生都认识双方,给出一些男女关系,问最大拿多少个人,使得所有人都认识双方。
思路:
原图最大团=总结点数-[【补图(补图为二分图)】的最大独立集=最大完全子图的顶点数];
//#include<bits/stdc++.h> #include<cstdio> #include<string.h> #include<algorithm> using namespace std; typedef long long LL; const int N=2e2+10; bool ma[N][N]; int n,m,e; int cx[N],cy[N]; bool vis[N]; bool FindPath(int u) { for(int v=1;v<=m;v++) { if(ma[u][v]&&!vis[v]) { vis[v]=true; if(cy[v]==-1||FindPath(cy[v])){ cx[u]=v; cy[v]=u; return true; } } } return false; } int MinPoint() { int res=0; memset(cx,-1,sizeof(cx)); memset(cy,-1,sizeof(cy)); for(int i=1;i<=n;i++){ if(cx[i]==-1) { memset(vis,0,sizeof(vis)); res+=FindPath(i); } } return res; } int main() { int cas=1; while(~scanf("%d%d%d",&n,&m,&e)) { if(!n&&!m&&!e) break; int u,v; memset(ma,true,sizeof(ma)); while(e--) { scanf("%d%d",&u,&v); ma[u][v]=false; } printf("Case %d: %d ",cas++,n+m-MinPoint()); } return 0; }