(1183)SCU

来源:互联网 发布:asp.net 字符串转json 编辑:程序博客网 时间:2024/05/21 14:56

题意:这里先吐槽下题意,看了好久没看明白,偷偷百度的才知道题意,一共有n个人,男生和女生之间呢有恋爱关系。给你一系列恋爱的关系,但是你不知道谁是男生谁是女生。问你求一个集合,这个集合中的人不存在恋爱关系,求最大人数。

解法:二分图匹配,把最大的恋爱关系对数求出来,然后除以2,因为1-2,2-1,被算作2组,实际是一组,所以用总人数减去恋爱人数就是不存在恋爱关系的集合。

如果还是不明白看这里

http://blog.csdn.net/weyuli/article/details/9621973

他题意解释的很好。。

我再贴下自己的代码

#include<iostream>#include<cstdio>#include<string.h>#include<string>#include<stack>#include<set>#include<algorithm>#include<cmath>#include<vector>#include<map>#define LL __int64#define lll unsigned long long#define MAX 1000009#define eps 1e-8#define INF 0xfffffff#define pi 2*acos(0.0)#define mod 10007using namespace std;int ma[509][509];int n;int a[1009];int k[1009];int g[1009][1009];bool dfs(int x){    for(int i = 0; i<n; i++)    {        if(g[x][i]&&!k[i])        {            k[i] = 1;            if(a[i]==-1||dfs(a[i]))            {                a[i] = x;                return true;            }        }    }    return false;}int main(){    int sum;    int num;    int xx,yy,zz;    string str;    while(~scanf("%d",&n))    {        getchar();        memset(g,0,sizeof(g));        memset(a,-1,sizeof(a));        for(int i = 0; i<n; i++)        {            scanf("%d: (%d)",&num,&xx);            for(int k=1;k<=xx;k++)            {                scanf("%d",&yy);                g[i][yy] = 1;            }        }        sum = 0;        for(int i = 0;i<n;i++)        {            memset(k,0,sizeof(k));            if(dfs(i))            {                sum++;            }        }        int ans = n - sum/2;        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击