题目地址:点击打开链接
思路:简单二分图匹配,代码粘的详解的,所以解释有点扯淡,对应关系是,为每个魔法棒找巫师,对应为每个光棍找妹子,注意光棍要从1开始循环,不能从0开始循环,不然会出错,导致的结果妹子的丈夫为0时,有时会再给她一个丈夫
AC代码:
#include<stdio.h> #include<string.h> int lol[110][110],visit[110],cf[110],n; bool find(int l) { int i; for(i=1; i<=n; i++) { if(lol[l][i] && !visit[i])//有好感并且没尝试把妹子许配给别人,要是visit[i]等于1表明,前面有一个人要i这个妹子要定了 { visit[i] = 1;//表明i这个妹子l要定了,别人不能再娶了,不然下面一条语句腾妹子的过程,本来想让i这个妹子的丈夫重娶一个妹子,结果这个妹子的丈夫还是娶了她,然后又把这个妹子配给l,这就太扯淡了,所以这一句不能放在if语句里面 if(!cf[i] || find(cf[i]))//i这个妹子没丈夫或者能让她的丈夫重娶一个妹子,和这个妹子离婚 { cf[i] = l;//妹子i的丈夫就是l了 return true;//光棍l摆脱单身 } } } return false; } int main() { int m,k,l,i,j,sum; while(scanf("%d%d",&n,&m) != EOF) { sum = 0; memset(lol,0,sizeof(lol)); memset(cf,0,sizeof(cf)); for(i=1; i<=m; i++)//i从1开始就过了,从0开始就过不了,为啥?有可能妹子i的丈夫是0,会误认为没有,所以从1开始赋值 { scanf("%d",&k); for(j=0; j<k; j++) { scanf("%d",&l); lol[i][l] = 1; } } for(i=1; i<=m; i++) { memset(visit,0,sizeof(visit)); if(find(i))//为每个光棍找妹子 sum++; } printf("%d\n",sum); } return 0; }