Hdu_3829 Cat VS Dog -最大独立集+建图

题意:动物园有n种猫,m种狗,小孩子喜欢猫就讨厌狗,喜欢狗就讨厌猫,只要孩子们不喜欢的东西不在,他们就开心,问他们的最大开心度。

分析:建图是个难点,反正我是不会建的,搜了题解才意识到可以建“矛盾边”这种东西。只要孩子们喜欢的东西有冲突就连边,最后找到最大的独立集就是答案了

/************************************************
Author        :DarkTong
Created Time  :2016/8/1 17:20:09
File Name     :Hdu_3829.cpp
*************************************************/

#include <bits/stdc++.h>
using namespace std;
const int maxn = 500 + 10;
vector<int> w[maxn];
int n, m;
int Left[maxn];
bool used[maxn];
bool match(int i)
{
    for(int j=0;j<w[i].size();++j) if(!used[w[i][j]])
    {
        int v = w[i][j];
        used[v] = true;
        if(!Left[v]||match(Left[v]))
        {
            Left[v] = i;
            return true;
        }
    }
    return false;
}
//返回最大匹配数
int hungary()
{
    int res=0;
    memset(Left, 0, sizeof(Left));
    for(int i=1;i<=n;++i)
    {
        memset(used, 0, sizeof(used));
        if(match(i)) res++;
    }
    return res;
}
char peo[maxn][2][5];

int main()
{
    int T, cas=1;
    int p;
    while(scanf("%d%d%d", &n, &m, &p)==3)
    {
    //    memset(w, 0, sizeof(w));
        for(int i=0;i<maxn;++i) w[i].clear();
        m=n=p;

        for(int i=1;i<=n;++i)
            scanf("%s%s", peo[i][0], peo[i][1]);
        for(int i=1;i<=n;++i)
            for(int j=1;j<=n;++j)
                if(strcmp(peo[i][1], peo[j][0])==0) w[i].push_back(j), w[j].push_back(i);
        printf("%d\n", (2*n-hungary())>>1);

    }

    return 0;
}

时间: 2025-01-02 15:30:45

Hdu_3829 Cat VS Dog -最大独立集+建图的相关文章

hdu 2768 Cat vs. Dog 最大独立集 巧妙的建图

题目分析: 一个人要不是爱狗讨厌猫的人,要不就是爱猫讨厌狗的人.一个人喜欢的动物如果离开,那么他也将离开.问最多留下多少人. 思路: 爱猫和爱狗的人是两个独立的集合.若两个人喜欢和讨厌的动物是一样的,那么就建一条边.留下多少人,就是求最大独立集. 最大独立集= 顶点数 - 最大匹配数 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #inc

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

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

(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

hdu2768Cat vs. Dog (反建法,最大独立集)

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

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 3829 - Cat VS Dog (二分图最大独立集)

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

二分图最大匹配,最小路径覆盖,最小点覆盖,最大独立集,最小边覆盖与建图方法

转载请注明出处(别管写的好坏,码字也不容易):http://blog.csdn.net/hitwhacmer1 前言:         有自己写的,有摘的别人的,前面是摘的,也是无心整理,出错是难免的,反正我都不会证明,智人见智,别被我误导了. §1图论点.边集和二分图的相关概念和性质 点覆盖.最小点覆盖 点覆盖集即一个点集,使得所有边至少有一个端点在集合里.或者说是"点" 覆盖了所有"边"..极小点覆盖(minimal vertex covering):本身为点覆

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