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<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 #define for0n for(i=0;i<n;i++)
 9 #define for1n for(i=1;i<=n;i++)
10 #define cl(a) memset(a,0,sizeof(a))
11 #define w12 while(scanf("%d%d",&n,&m)!=EOF)
12 int n,m,t;
13 const int MAXN = 1510;
14 int uN,vN;//u,v的数目,使用前面必须赋值
15 int g[MAXN][MAXN];//邻接矩阵
16 int linker[MAXN];
17 bool used[MAXN];
18 bool dfs(int u)
19 {
20     for(int v = 0; v < vN;v++)
21     if(g[u][v] && !used[v])
22     {
23         used[v] = true;
24         if(linker[v] == -1 || dfs(linker[v]))
25         {
26             linker[v] = u;
27             return true;
28         }
29     }
30     return false;
31 }
32 int hungary()
33 {
34     int res = 0;
35     memset(linker,-1,sizeof(linker));
36     for(int u = 0;u < uN;u++)
37     {
38         memset(used,false,sizeof(used));
39         if(dfs(u))res++;
40     }
41     return res;
42 }
43 int main()
44 {
45     int i,j,k;
46     #ifndef ONLINE_JUDGE
47     freopen("1.in","r",stdin);
48     #endif
49     char s1[MAXN][5],s2[MAXN][5];
50     int p;
51     while(scanf("%d%d%d",&n,&m,&p)!=EOF)
52     {
53         cl(g);
54         for(i=0;i<p;i++)
55         {
56             scanf("%s%s",s1[i],s2[i]);
57         }
58         uN=vN=p;
59         for(i=0;i<p;i++)
60         {
61             for(j=i+1;j<p;j++)
62             {
63                 if(strcmp(s1[i],s2[j])==0||strcmp(s1[j],s2[i])==0)
64                 {
65                     g[i][j]=1;
66                     g[j][i]=1;
67                 }
68             }
69         }
70         printf("%d\n",p-hungary()/2);
71     }
72 }
时间: 2024-08-13 17:44:44

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

Hdu 3289 Rain on your Parade (二分图匹配 Hopcroft-Karp)

题目链接: Hdu 3289 Rain on your Parade 题目描述: 有n个客人,m把雨伞,在t秒之后将会下雨,给出每个客人的坐标和每秒行走的距离,以及雨伞的位置,问t秒后最多有几个客人可以拿到雨伞? 解题思路: 数据范围太大,匈牙利算法O(n*m)果断华丽丽的TLE,请教了一下度娘,发现还有一种神算法—— Hopcroft-Karp,然后就get√新技能,一路小跑过了,有一点不明白的是hdu上竟然有人0ms过,这又是什么神姿势(吓哭!!!!!),额.........,扯远了.  H

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

hdu 3829 最大独立集

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

HDU 1045 - Fire Net (最大独立集)

题意:给你一个正方形棋盘.每个棋子可以直线攻击,除非隔着石头.现在要求所有棋子都不互相攻击,问最多可以放多少个棋子. 这个题可以用搜索来做.每个棋子考虑放与不放两种情况,然后再判断是否能互相攻击来剪枝.最后取可以放置的最大值. 这里我转化成求最大独立集来做. 首先将每个空地编号,对于每个空地,与该位置可以攻击到的空地连边.找最多的空地使得不互相攻击,即求该图的最大独立集.与搜索做法基本一致,但是说法略有不同. 1 #include<iostream> 2 #include<cstring

hdu - 1068 Girls and Boys (二分图最大独立集+拆点)

http://acm.hdu.edu.cn/showproblem.php?pid=1068 因为没有指定性别,所以要拆点,把i拆分i和i’ 那么U=V-M (M是最大匹配,U最大独立集,V是顶点数) 2U=2V-2M  所以 U=n-M'/2. (没怎么看明白)  但是不这样会wa. 1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <vector> 5 #inc

HDU 1068 Girls and Boys(最大独立集合 = 顶点数 - 最大匹配数)

HDU 1068 :题目链接 题意:一些男孩和女孩,给出一些人物关系,然后问能找到最多有多少个人都互不认识. 转换一下:就是大家都不认识的人,即最大独立集合 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <math.h> #define init(a) memset(a,

HDU 1068 Girls and Boys (二分图最大独立集)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1068 有n个同学,格式ni:(m) n1 n2 n3表示同学ni有缘与n1,n2,n3成为情侣,求集合中不存在有缘成为情侣的同学的最大同学数. 独立集(图的顶点集的子集,其中任意两点不相邻) 二分图中 最大独立集 = 顶点个数 - 最大匹配数 因为男女不知道,将一个人拆成两个性别,求最大匹配后,除以2就行了. 这种做法比较难理解. 1 #include <iostream> 2 #include

hdu 1068 Girls and Boys(匈牙利算法求最大独立集)

Girls and Boys Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7044    Accepted Submission(s): 3178 Problem Description the second year of the university somebody started a study on the roman