HDU--3829--Cat VS Dog【最大点独立集】

链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829

题意:动物园有n条狗,m头猫,p个小孩。每一个小孩有一个喜欢的动物和讨厌的动物,如今动物园要转移一些动物,假设一个小孩喜欢的动物在,不喜欢的动物不在,他就会happy,问动物最多能使几个小孩happy。

思路:一个比較明显的二分图。不能以猫狗为顶点,那样找到的是哪些动物会转移,以小孩为顶点,找出最大点独立集,有两种建图方式。一种是以小孩总数p为左右点集的顶点个数。假设小孩a喜欢的动物是小孩b不喜欢的动物。就连一条边edge(a,b);另外一种是以喜欢猫的小孩总数为左顶点个数,喜欢狗的为右顶点,依据矛盾连边。

这样两种仅仅是顶点数目不同。

然后找二分图最大点独立集

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

只是第一种建图左右顶点数都是p,也就是每一个小孩在左右都有出现。总共出现两次,所以找到最大点独立集后除以2就是答案。

#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 500010
#define eps 1e-7
#define INF 0x3F3F3F3F      //0x7FFFFFFF
#define LLINF 0x7FFFFFFFFFFFFFFF
#define seed 1313131
#define MOD 1000000007
#define ll long long
#define ull unsigned ll
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

struct node{
    int v,next;
}edge[MAXN];
int head[510],vis[510],dx[510],dy[510];
int cnt,n1,n2;  //n1左边的点数,n2右边的点数
void add_edge(int a,int b){
    edge[cnt].v = b;
    edge[cnt].next = head[a];
    head[a] = cnt++;
}
int path(int u){
    int i, j;
    for(i=head[u];i!=-1;i=edge[i].next){
        int v = edge[i].v;
        if(!vis[v]){
            vis[v] = 1;
            if(dy[v] == -1 || path(dy[v])){
                dx[u] = v;
                dy[v] = u;
                return 1;
            }
        }
    }
    return 0;
}
int maxmatch(){
    int i, j;
    int res = 0;
    memset(dx,-1,sizeof(dx));
    memset(dy,-1,sizeof(dy));
    for(i=1;i<=n1;i++){
        if(dx[i]==-1){
            memset(vis,0,sizeof(vis));
            res += path(i);
        }
    }
    return res;
}
struct Node{
    string like,dislike;
}animal[505];
int main(){
    int n,m,p,i,j;
    while(scanf("%d%d%d",&n,&m,&p)!=EOF){
        cnt = 0;
        memset(head,-1,sizeof(head));
        for(i = 0; i < p; i++){
            cin>>animal[i].like>>animal[i].dislike;
        }
        n1 = p;
        for(i = 0; i < p; i++){
            for(j = 0; j < p; j++){
                if(animal[i].like == animal[j].dislike || animal[i].dislike == animal[j].like){
                    add_edge(i + 1, j + 1);
                }
            }
        }
        int ans = maxmatch();
        printf("%d\n", (2 * p - ans) / 2);
    }
    return 0;
}
时间: 2024-10-07 04:50:18

HDU--3829--Cat VS Dog【最大点独立集】的相关文章

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

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

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 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 Cat VS Dog

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

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

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

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

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

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