题意:http://acm.hdu.edu.cn/showproblem.php?pid=2458
本题要求学生中相互了解的人数最多有多少。男生之间都是相互了解的,女生之间也是相互了解的,所以我们可以把相互了解的人之间的边看成是1,所以男生是一个集合,女生是一个集合,map[男][男]=1;map[女][女]=1;当男生和女生熟悉时,map[][]=1;当男生与女生不了解时,map[][]=0;所以求相互了解的人最多有几个就是求构造出的二分图的最大独立集。(本来最大独立集是指互不相关的点最多有几个,而此处我们把相关的定义为map[][]=1;不相关的定义为map[][]=0;所以最大独立集就是所有互相了解的人的集合)
//最大匹配数=最小点覆盖=n-最大点独立集
表示不是搞图论的,只会弄模板。。。
#include <iostream> #include <cstring> #include <cstdio> #include <string> using namespace std; const int N=300; int map[N][N]; int n,m,k; int vis[N]; int mark[N]; bool dfs(int a) { int i; for(i=1;i<=m;i++) { if(!map[a][i] && !vis[i]) { vis[i]=1; if(mark[i]==0 || dfs(mark[i])) { mark[i]=a; return true; } } } return false; } int maxmatch() { int i, res = 0; memset(mark, 0, sizeof(mark)); for (i = 1; i <=n; i++) { memset(vis, false, sizeof(vis)); if (dfs(i)) res++; } return res; } int main() { int cas=0; while(scanf("%d%d%d",&n,&m,&k)!=EOF)//m是boy的个数 { if(!n&&!m&&!k)break; memset(map,0,sizeof(map)); int u,v; for(int i=0; i<k; i++) { scanf("%d%d",&u,&v); map[u][v]=1;//相识标为1 } cas++; int ans=maxmatch();//最大匹配数 printf("Case %d: %d\n",cas,n+m-ans); } return 0; }