题目大意:给出n个学生,给出每个学生都对谁有意思,然后问的是尽量多的配对的情况下,最多能剩几个光棍(这里剩几个的意思是剩下的人加上每对陪过对的人抽出来一个人,因为他们只对对方情有独钟,拉出来一个不管剩下的人的好坏都是不愿意和他们配对的)
读懂了题意,就可以知道这是个求最大独立集数的题
Sample Input
7 0: (3) 4 5 6 1: (2) 4 6 2: (0) 3: (0) 4: (2) 0 1 5: (1) 0 6: (2) 0 1 3 0: (2) 1 2 1: (1) 0 2: (1) 0
Sample Output
5 2
题目链接:点击打开链接
代码注释:
<span style="font-size:18px;color:#ff6600;"><strong>#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define N 505 int a[N][N],visit[N],link[N]; int n; int dfs(int i) { for(int j=0; j<n; j++)//扫描每个妹子 { if(a[i][j]&&!visit[j])//没有相亲成功 { visit[j]=1; if(link[j]==-1||dfs(link[j]))//没有对象,或者找其他对象也能凑活,来给新来的哥们腾位置 { link[j]=i; return 1; } } } return 0; } int hungary() { int sum=0; memset(link,-1,sizeof(link)); for(int i=0; i<n; i++) { memset(visit,0,sizeof(visit)); if(dfs(i)) sum++; } return sum; } int main() { int i; while(cin>>n) { memset(a,0,sizeof(a)); for(i=0; i<n; i++) { int x,y,m; scanf("%d: (%d)",&x,&m); while(m--) { cin>>y; a[x][y]=1; } } cout<<n-hungary()/2<<endl; //套用公式即可 } }</strong></span>还不明白代码意思的可以看我转载的一个大神的博客,讲解十分生动有趣!!令人印象深刻关于二分其他问题可以看我其他博客
本文探讨了如何通过最大独立集的求解方法,解决在给定学生间的情感匹配问题中,最大化匹配数量并确定剩余的光棍人数。提供了一个具体的实例解析及代码实现,深入浅出地解释了算法原理及应用。
8万+

被折叠的 条评论
为什么被折叠?



