Girls and Boys||HDU1068

来源:互联网 发布:淘宝发货后立即回款 编辑:程序博客网 时间:2024/05/17 08:35

link:http://acm.hdu.edu.cn/showproblem.php?pid=1068
Problem Description

the second year of the university somebody started a study on the romantic relations between the students. The relation “romantically involved” is defined between one girl and one boy. For the study reasons it is necessary to find out the maximum set satisfying the condition: there are no two students in the set who have been “romantically involved”. The result of the program is the number of students in such a set.The input contains several data sets in text format. Each data set represents one set of subjects of the study, with the following description:the number of studentsthe description of each student, in the following formatstudent_identifier:(number_of_romantic_relations) student_identifier1 student_identifier2 student_identifier3 ...orstudent_identifier:(0)The student_identifier is an integer number between 0 and n-1, for n subjects.For each given data set, the program should write to standard output a line containing the result.

Sample Input

70: (3) 4 5 61: (2) 4 62: (0)3: (0)4: (2) 0 15: (1) 06: (2) 0 130: (2) 1 21: (1) 02: (1) 0

Sample Output

52

题解:二分的最大独立集
最大独立集:
在二分图中,独立集指的是两两之间没有边的顶点的集合,顶点最多的独立集成为最大独立集。
二分图的最大独立集=节点数-最大匹配数
利用匈牙利算法就行,不过传统的模板要做一些改变,因为这个里面没有男生数和女孩数,只有数字喜欢数字,那我们就算出相爱的数字数然后除以2,就是最大匹配数(因为每个样例里给出的数字都是互相喜欢的),然后n减去这个数就是结果
AC代码:

#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>using namespace std;int f[1010];bool fr[1010][1010];bool vis[1010];int n;int find(int x){    int i;    for ( i=0 ; i<n ; i++ )    {        if ( fr[x][i] && !vis[i] )        {            vis[i] = true;            if ( f[i]==-1 || find(f[i]) )            {                f[i] = x;                return true;            }        }    }    return false;}int main(){    int i,a,b,c,d,ans;    while(~scanf("%d",&n))    {        memset(f,-1,sizeof(f));        memset(fr,false,sizeof(fr));        ans=0;        for ( i=0 ; i<n ; i++ )        {            scanf("%d: (%d)",&a,&b);            while(b--)            {                scanf("%d",&c);                fr[a][c] = true;//互相喜欢                 fr[c][a] = true;            }        }        for ( i=0 ; i<n ; i++ )        {            memset(vis,false,sizeof(vis));            if ( find(i) )                ans++;        }        ans /= 2;        printf("%d\n",n-ans);    }return 0;}
原创粉丝点击