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

题意:有P个孩子,有的孩子喜欢猫不喜欢狗,有的喜欢狗不喜欢猫(喜欢的和不喜欢的一定是相相对立的动物),动物园有N只猫,M只狗,每个孩子都有喜欢的猫讨厌的狗(或者喜欢的狗讨厌的猫),现在动物园要送走一批猫或者狗,如果某个孩子喜欢的动物留下并且讨厌的动物离开,那么这个孩子就会很开心,现在求出来最多能让多少个孩子开心。

分析:很明显可以看出来某个孩子喜欢的和别人讨厌的如果是同一个的话,那么他们之间就存在矛盾(也就是说不可能同时满足这两个孩子),可以根据给的喜好建立一个关系图,也就是有矛盾的孩子连线,,我们希望减少最少的孩子来消除所有的矛盾,既是最小点覆盖,二分图的最小点覆盖等于最大匹配数,求出来用总孩子数减去即可。

*************************************************************************

#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
using namespace std;

const int MAXN = 505;
const int oo = 1e9+7;

struct Animal{int like, hate;}Lcat[MAXN], Ldog[MAXN];

bool G[MAXN][MAXN], used[MAXN];
int Ly[MAXN];

bool Find(int i, int N)
{
    for(int j=1; j<=N; j++)
    {
        if(G[i][j] && used[j] == false)
        {
            used[j] = true;
            if(!Ly[j] || Find(Ly[j], N))
            {
                Ly[j] = i;
                return true;
            }
        }
    }

return false;
}

int main()
{
    int M, N, P;

while(scanf("%d%d%d", &N, &M, &P) != EOF)
    {
        int i, j, u, v, cn=0, dn=0;
        char ch1, ch2;

memset(G, false, sizeof(G));
        memset(Ly, false, sizeof(Ly));

for(i=1; i<=P; i++)
        {
            scanf(" ");
            scanf("%c%d %c%d", &ch1, &u, &ch2, &v);

if(ch1 == ‘C‘)
            {///喜欢猫u,不喜欢狗v
                Lcat[++cn].like = u;
                Lcat[cn].hate = v;
            }
            else
            {///喜欢狗u,不喜欢猫v
                Ldog[++dn].like = u;
                Ldog[dn].hate = v;
            }
        }

for(i=1; i<=cn; i++)
        for(j=1; j<=dn; j++)
        {///如果喜欢猫A的小孩发现不喜欢猫A的小孩,
         ///或者不喜欢狗A的小孩发现喜欢狗A的,都是排斥关系
            if( Lcat[i].like == Ldog[j].hate || Lcat[i].hate == Ldog[j].like )
                G[i][j] = true;
        }

int ans = 0;

for(i=1; i<=cn; i++)
        {
            memset(used, false, sizeof(used));
            if( Find(i, dn) == true )
                ans ++;
        }

printf("%d\n", P-ans);
    }

return 0;

}

时间: 2024-08-28 02:12:44

L - Cat VS Dog - HDU 3829(最大独立集)的相关文章

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

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

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

Cat VS Dog 题意:一群小朋友去动物园,如果每个小朋友喜欢的动物是猫,那么不喜欢的动物一定是狗,反之也是.现在动物园的管理者要拿走一些动物,如果拿走的是某个小朋友不喜欢的动物,那这个小朋友就非常开心,反之,如果是某个小朋友喜欢的动物,这个小朋友就非常的不开心,问那完后最多有几个小朋友会非常开心. 暑假最后一场个人赛,可还行,有点凉凉~~ 讲真看出是二分图最大匹配的题目,但是没学最大独立集,死活建不出图来,就到底还是自己的能力不行啊! 最小覆盖: 定义:假如选了一个点就相当于覆盖了以它为端

hdu 3829 最大独立集

思路:很显然,让某一个孩子happy是一定可以做到的,但是同时有可能会让别的孩子unhappy,所以每一对这样的两个孩子之间存在”冲突”,如果在存在“冲突”的孩子之间建边的话,我们的问题就转化成了求二分图的最大独立集.具体为什么是二分图,博主也没有想明白... 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 50

hdu 3829 Cat VS Dog 二分图匹配 最大点独立集

Cat VS Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Problem Description The zoo have N cats and M dogs, today there are P children visiting the zoo, each child has a like-animal and a dislike-animal, if the

(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<

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

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): 2279    Accepted Submission(s): 886 Problem Description The latest reality show has hit the TV: ``Cat vs. Dog''. In this show, a bunc