hdu 3829 最大独立集

思路:很显然,让某一个孩子happy是一定可以做到的,但是同时有可能会让别的孩子unhappy,所以每一对这样的两个孩子之间存在”冲突”,如果在存在“冲突”的孩子之间建边的话,我们的问题就转化成了求二分图的最大独立集。具体为什么是二分图,博主也没有想明白...

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5
 6 const int N = 501;
 7 const int M = N * N;
 8 const int L = 11;
 9 bool visit[N];
10 int head[N];
11 int mark[N];
12 int n, m, p, e;
13
14 struct Edge
15 {
16     int v, next;
17 } edge[M];
18
19 struct Hobby
20 {
21     char like[L], dislike[L];
22 } hobby[N];
23
24 void init()
25 {
26     e = 0;
27     memset( head, -1, sizeof(head) );
28 }
29
30 void addEdge( int u, int v )
31 {
32     edge[e].v = v;
33     edge[e].next = head[u];
34     head[u] = e++;
35 }
36
37 int dfs( int u )
38 {
39     for ( int i = head[u]; i != -1; i = edge[i].next )
40     {
41         int v = edge[i].v;
42         if ( !visit[v] )
43         {
44             visit[v] = true;
45             if ( mark[v] == -1 || dfs( mark[v] ) )
46             {
47                 mark[v] = u;
48                 mark[u] = v;
49                 return 1;
50             }
51         }
52     }
53     return 0;
54 }
55
56 int hunagry()
57 {
58     memset( mark, -1, sizeof(mark) );
59     int res = p;
60     for ( int i = 1; i <= p; i++ )
61     {
62         if ( mark[i] != -1 ) continue;
63         memset( visit, 0, sizeof(visit) );
64         res -= dfs(i);
65     }
66     return res;
67 }
68
69 int main()
70 {
71     while ( scanf("%d%d%d", &n, &m, &p) != EOF )
72     {
73         init();
74         for ( int i = 1; i <= p; i++ )
75         {
76             scanf("%s%s", hobby[i].like, hobby[i].dislike);
77             for ( int j = i - 1; j > 0; j-- )
78             {
79                 if ( strcmp( hobby[i].like, hobby[j].dislike ) == 0
80                 ||   strcmp( hobby[j].like, hobby[i].dislike ) == 0 )
81                 {
82                     addEdge( i, j );
83                     addEdge( j, i );
84                 }
85             }
86         }
87         printf("%d\n", hunagry());
88     }
89     return 0;
90 }
时间: 2024-11-08 01:07:34

hdu 3829 最大独立集的相关文章

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

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

HDU 3829

http://acm.hdu.edu.cn/showproblem.php?pid=2970 P个小朋友喜欢猫讨厌狗,喜欢狗讨厌猫,移除一定数量的猫狗,使开心的小朋友数量最多 二分图最大独立集=顶点数-二分图最大匹配 对喜好冲突的小朋友连边,因为对小朋友建图拆了点,求出的最大匹配要除以2 和hdu 1068是一个意思 二分图最大独立集和最大匹配的含义在题目中是相反的,比如这道题要求开心的小朋友的最大独立集,二分图建图的时候就要用不开心的小朋友组合连边,这类题目一定是给出冲突的关系,才可以去求解

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(最大独立集)

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

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

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

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 3289 最大独立集

题意:一个动物园里有N只猫和K只狗,一些小朋友来参观,他们如果喜欢狗就不喜欢猫,喜欢猫就不喜欢狗,园长想要移走一些动物,如果,移走的是某个小朋友不喜欢的,而喜欢的没被移走,该小朋友就会高兴,求移动的数目使得最多的小朋友开心 Sample Input 1 1 2 //1个猫1个狗2个小朋友 C1 D1 //一号小朋友喜欢c1,讨厌d1 D1 C1 1 2 4 C1 D1 C1 D1 C1 D2 D2 C1 转换为最大独立集做 1 #include<cstdio> 2 #include<io

HDU 3829 Cat VS Dog

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

hdu 3335 最大独立集,疑惑

有整除关系就建边,然后求最大独立集,不过还是不懂为什么建双向边hunagry返回结果除以2就会WA. 单向建边的AC代码: 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 1001; 7 const int M = 1000000; 8 bool visit[N]; 9 __int64 a[N]; 10 int