Cat VS Dog HDU_3829(最大独立集最大匹配)

Cat VS Dog

题意:一群小朋友去动物园,如果每个小朋友喜欢的动物是猫,那么不喜欢的动物一定是狗,反之也是。现在动物园的管理者要拿走一些动物,如果拿走的是某个小朋友不喜欢的动物,那这个小朋友就非常开心,反之,如果是某个小朋友喜欢的动物,这个小朋友就非常的不开心,问那完后最多有几个小朋友会非常开心。

暑假最后一场个人赛,可还行,有点凉凉~~

讲真看出是二分图最大匹配的题目,但是没学最大独立集,死活建不出图来,就到底还是自己的能力不行啊!

最小覆盖:

定义:假如选了一个点就相当于覆盖了以它为端点的所有边。最小顶点覆盖就是选择最少的点来覆盖所有的边。

求解方法:最小顶点覆盖等于二分图的最大匹配。

看定义~~~~~~不懂,找了找图,照着一对比,明白了。放图

?

很对!没错!!最小顶点覆盖就是3,符合条件的点就是图中的{2,4,7}

最大独立集:

定义:选出一些顶点使得这些顶点两两不相邻,则这些点构成的集合称为独立集。找出一个包含顶点数最多的独立集称为最大独立集。

求解方法:最大独立集 = 顶点个数 - 最小覆盖

看了定义依旧不懂,脑子是个好东西啊,还是上边的图,再结合题意,有点懂了,关门放图~~

?

图中的红线是最大匹配的结果所以经过最大匹配后得到的最小覆盖是3,而筛选出来的顶点有{2,4,7},那剩下的就是最大独立集{1,3,5,6,8,9}

思路:看完知识点来解一下思路吧。将每个小朋友喜欢的动物和不喜欢的动物保存起来,遍历,如果这个小朋友喜欢的动物是另一个小朋友不喜欢的动物就在这两个之间画一条线。求最小覆盖(最大匹配),此时用总共的点数减去这个最小覆盖得结果就是高兴的小朋友的最大人数。

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
#include <algorithm>
#define FRE() freopen("in.txt","r",stdin)
#define INF 0x3f3f3f3f

using namespace std;
typedef long long ll;
const int maxn = 600;
int mp[maxn][maxn],link[maxn],vis[maxn];
string like[maxn];
string dislike[maxn];
int n,m,p;

bool dfs(int x)
{
    for(int i = 0; i < p; i++)
    {
        if(!vis[i] && mp[x][i])
        {
            vis[i] = 1;
            if(link[i] == 0 || dfs(link[i]))
            {
                link[i] = x;
                return true;
            }
        }
    }
    return false;
}

int hunary()
{
    int res = 0;
    memset(link,0,sizeof(link));
    for(int i = 0; i < p; i++)
    {
        memset(vis,0,sizeof(vis));
        if(dfs(i))
            res++;
    }
    return res;
}

int main()
{
    while(scanf("%d%d%d",&n,&m,&p) != EOF)
    {
        for(int i = 0; i < p; i++)
            cin>>like[i]>>dislike[i];

        memset(mp, 0, sizeof(mp));
        for(int i = 0; i < p; i++)
        for(int j = 0; j < p; j++)
        {
            if(like[i].compare(dislike[j]) == 0 || like[j].compare(dislike[i]) == 0)
                mp[i][j] = 1;
        }
        int res = hunary();
        printf("%d\n",p - res/2);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/sykline/p/9737798.html

时间: 2024-08-30 10:01:20

Cat VS Dog HDU_3829(最大独立集最大匹配)的相关文章

HDU 3829 Cat VS Dog(最大独立集)

题目大意: 有n只猫,有m只狗.现在有P个学生去参观动物园.每个孩子有喜欢的动物和不喜欢的动物.假如他喜欢猫那么他就一定不喜欢狗(反之亦然). 如果一个孩子喜欢一个动物,那么这个动物不会被移除,若是不喜欢则移除.现在管理员想知道移除哪些动物可以使最大数量的孩子高兴. 输入数据: 输入包含多组测试实例. 第一行是三个数字n, m, p. 接下来p行. 每行 CX, DX 代表他喜欢第X只猫,讨厌第X只狗(反之亦然) 题目思路: 构图思路:我们把所有人进行构图,如果两个人之间有矛盾就建立一条边.然后

UVA-4288 Cat vs. Dog (最大独立集)

题目大意:猫狗大赛,s个猫和t个狗,有v个投票者,他们不是爱猫者就是爱狗者,所以爱猫者一定会对某条猫投晋级票,对某条狗投淘汰票,爱狗者亦然.现在已知这v个人的投票情况,应该使哪些畜牲晋级或淘汰才能使投票者满意(喜欢的晋级,讨厌的淘汰)的人数最多?求出最多满意人数. 题目分析:有同一爱好的人群之间不会有矛盾.当爱猫者的晋级票与爱狗者的淘汰票是同一只猫或爱猫者的淘汰票与爱狗者的晋级票是同一条狗时,视为这二人有矛盾,在他们之间连一条有向边,把所有有矛盾的人找出来建一张有向图.这就意味着一条边的两端点的

HDU3829 Cat VS Dog(最大独立集)

题意: n个小孩,每个小孩喜欢一种动物讨厌一种动物 你是管理员,可以任意去掉一些动物 当小孩讨厌的动物被去掉并且喜欢的动物没有被去掉时, 他是开心的 问最多让多少小孩开心 思路: 让有矛盾的小孩建边,求最大独立集即可 /* *********************************************** Author :devil Created Time :2016/5/17 17:13:21 *******************************************

HDU 3829 - Cat VS Dog (二分图最大独立集)

题意:动物园有n只猫和m条狗,现在有p个小孩,他们有的喜欢猫,有的喜欢狗,其中喜欢猫的一定不喜欢狗,喜欢狗的一定不喜欢猫.现在管理员要从动物园中移除一些动物,如果一个小孩喜欢的动物留了下来而不喜欢的动物被移走,这个小孩会很高兴.现在问最多可以让多少个小孩高兴. 此题是求二分图最大独立集. 二分图比较明显,但是难在建图.这个题是找到最多的喜欢猫和喜欢狗而不互相冲突的小孩,这样我们将喜欢动物相互冲突的小孩之间连边,问题就变成了求二分图的最大独立集. 在二分图中,最大独立集=顶点数-最大匹配数. 求解

(hdu step 6.3.7)Cat vs. Dog(当施工方规则:建边当观众和其他观众最喜爱的东西冲突,求最大独立集)

称号: Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 219 Accepted Submission(s): 86   Problem Description The latest reality show has hit the TV: ``Cat vs. Dog''. In this show, a bunch

HDU 3289 Cat VS Dog (二分匹配 求 最大独立集)

题意:每个人有喜欢的猫和不喜欢的狗.留下他喜欢的猫他就高心,否则不高心.问最后最多有几个人高心. 思路:二分图求最大匹配 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<cstdlib> 6 #include<string> 7 #include<cmath> 8 #include<

UVA 12168 - Cat vs. Dog(二分图匹配+最大独立集)

UVA 12168 - Cat vs. Dog 题目链接 题意:给定一些猫爱好者,和一些狗爱好者,每个人都有一个喜欢的猫(狗),和一个讨厌的狗(猫),要问现在给一种方案,使得尽量多的人被满足 思路:二分图匹配最大独立集,猫爱好者和狗爱好者矛盾的建边,做一次最大独立集即可 代码: #include <cstdio> #include <cstring> #include <vector> using namespace std; const int N = 505; in

hdu 2768 Cat vs. Dog (二分匹配)

Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1422    Accepted Submission(s): 534 Problem Description The latest reality show has hit the TV: ``Cat vs. Dog''. In this show, a bunch

HDU——2768 Cat vs. Dog

Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2279    Accepted Submission(s): 886 Problem Description The latest reality show has hit the TV: ``Cat vs. Dog''. In this show, a bunc