HDU 3829

http://acm.hdu.edu.cn/showproblem.php?pid=2970

P个小朋友喜欢猫讨厌狗,喜欢狗讨厌猫,移除一定数量的猫狗,使开心的小朋友数量最多

二分图最大独立集=顶点数-二分图最大匹配

对喜好冲突的小朋友连边,因为对小朋友建图拆了点,求出的最大匹配要除以2

和hdu 1068是一个意思

二分图最大独立集和最大匹配的含义在题目中是相反的,比如这道题要求开心的小朋友的最大独立集,二分图建图的时候就要用不开心的小朋友组合连边,这类题目一定是给出冲突的关系,才可以去求解

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
int T,M[505][505],n,m,linkx[505],linky[505],vis[505] ;
int find(int s)
{
    for(int i=1 ;i<=m ;i++)
    {
        if(M[s][i])
        {
            if(vis[i]==T)continue ;
            vis[i]=T ;
            if(!linky[i] || find(linky[i]))
            {
                linky[i]=s ;
                linkx[s]=i ;
                return 1 ;
            }
        }
    }
    return 0 ;
}
int max_match()
{
    int ans=0 ;
    memset(linkx,0,sizeof(linkx)) ;
    memset(linky,0,sizeof(linky)) ;
    memset(vis,0,sizeof(vis)) ;
    for(int i=1 ;i<=n ;i++)
    {
        T=i ;
        ans+=find(i);
    }
    return ans;
}
char like[505][15],dislike[505][15] ;
int main()
{
    int nn,mm,P ;
    while(~scanf("%d%d%d",&nn,&mm,&P))
    {
        n=m=P ;
        for(int i=1 ;i<=n ;i++)
        {
            scanf("%s%s",like[i],dislike[i]) ;
        }
        memset(M,0,sizeof(M)) ;
        for(int i=1 ;i<=n ;i++)
        {
            for(int j=1 ;j<=n ;j++)
            {
                if(!strcmp(like[i],dislike[j]) || !strcmp(like[j],dislike[i]))
                {
                    M[i][j]=1 ;
                }
            }
        }
        printf("%d\n",P-max_match()/2) ;
    }
    return 0 ;
}

HDU 3829

时间: 2024-10-08 22:21:41

HDU 3829的相关文章

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

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

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829 题目大意: 给定N个猫,M个狗,P个小朋友,每个小朋友都有喜欢或者不喜欢的某猫或者某狗 管理员从中删除一些猫狗,使得尽可能多的小朋友开心 思路: 假设A小朋友喜欢的猫是B小朋友所不喜欢的,或者说A不喜欢的狗是B喜欢的,那么说明两者之间存在矛盾关系 问题就是求出互相之间没有矛盾的小朋友的集合 那么就是点数-最大匹配数的问题了,就是读入数据有点麻烦 代码: 1 #include <iostream

hdu 3829 二分图最大独立集

将孩子看做点,两个孩子间存在矛盾关系则连一条边,最后求二分图最大独立集即可 // // main.cpp // hdu3829 // // Created by Fangpin on 15/5/29. // Copyright (c) 2015年 FangPin. All rights reserved. // #include <iostream> #include <cstdio> #include <cstring> #include <vector>

HDU 3829 Cat VS Dog

题意: p个人  每个人有喜欢和讨厌的动物  如果选出的动物中包含这个人喜欢的动物同时不包含他讨厌的动物那么这个人会开心  问  最多几个人开心 思路: 二分图最大独立集  利用人与人之间的冲突建边  求最大匹配即可 注意: 题中的样例给出动物的名字是D1.C1之类的  其实名字可能比这个长-  所以数组开长点 代码: #include<cstdio> #include<iostream> #include<cstring> #include<string>

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

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

题意:有P个孩子,有的孩子喜欢猫不喜欢狗,有的喜欢狗不喜欢猫(喜欢的和不喜欢的一定是相相对立的动物),动物园有N只猫,M只狗,每个孩子都有喜欢的猫讨厌的狗(或者喜欢的狗讨厌的猫),现在动物园要送走一批猫或者狗,如果某个孩子喜欢的动物留下并且讨厌的动物离开,那么这个孩子就会很开心,现在求出来最多能让多少个孩子开心. 分析:很明显可以看出来某个孩子喜欢的和别人讨厌的如果是同一个的话,那么他们之间就存在矛盾(也就是说不可能同时满足这两个孩子),可以根据给的喜好建立一个关系图,也就是有矛盾的孩子连线,,

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

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

HDU 3829 二分图

点击打开链接 题意:动物园有n只猫,m条狗,还有p个小孩,每个小孩有一个喜欢的动物和一个讨厌的动物,如果一个小孩喜欢狗,那么他一定不喜欢猫,每个小孩高兴的条件是他喜欢的动物在动物园并且不喜欢的动物不在,问饲养员将那些动物移出动物园可以使最多的小孩高兴 思路:最后剩下的小孩他们之间喜欢和讨厌的是不会有冲突的,那么可以转化为开心的小朋友的最大独立集,最大独立集=顶点数-最大匹配:而这个最大匹配是什么呢,是有矛盾的小朋友的最大匹配,减去后就是没有矛盾的了 #include <queue> #incl

hdu 3829 最大独立集

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