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

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

题目大意:

给定N个猫,M个狗,P个小朋友,每个小朋友都有喜欢或者不喜欢的某猫或者某狗

管理员从中删除一些猫狗,使得尽可能多的小朋友开心

思路:

假设A小朋友喜欢的猫是B小朋友所不喜欢的,或者说A不喜欢的狗是B喜欢的,那么说明两者之间存在矛盾关系

问题就是求出互相之间没有矛盾的小朋友的集合

那么就是点数-最大匹配数的问题了,就是读入数据有点麻烦

代码:

 1 #include <iostream>
 2 #include <string>
 3 #include <map>
 4 #include <stdio.h>
 5 #include <string.h>
 6 using namespace std;
 7 const int maxn=505;
 8 int N,M,P,c_cnt,d_cnt;
 9 int g[maxn][maxn],vis[maxn],who[maxn];
10 struct node {
11     int data[2][205];//[0][]like [1][]don‘t like
12 } ans[maxn];
13 map<string,int> c,d;
14 map<string,int>::iterator it;
15 string s;
16 void rs(int i,int dir) {
17     if(s[0]==‘C‘) {
18         if(!c.count(s)) c.insert(pair<string,int>(s,c_cnt++));
19         it=c.find(s);
20         ans[i].data[dir][it->second]=1;
21     } else {
22         if(!d.count(s)) d.insert(pair<string,int>(s,d_cnt++));
23         it=d.find(s);
24         ans[i].data[dir][it->second]=1;
25     }
26 }
27 void read() {
28     memset(g,0,sizeof(g));
29     memset(who,0,sizeof(who));
30     memset(ans,0,sizeof(ans));
31     c.clear();
32     d.clear();
33     c_cnt=1;
34     d_cnt=101;
35     for(int i=1; i<=P; ++i) {
36         cin>>s;//like
37         int dir=0;
38         rs(i,dir);
39         cin>>s;//don‘t like
40         dir^=1;
41         rs(i,dir);
42     }
43     for(int i=1; i<=P; ++i)
44         for(int j=i+1; j<=P; ++j)
45             for(int k=1; k<=200; ++k)
46                 if((ans[i].data[0][k]==1&&ans[j].data[1][k]==1)||(ans[i].data[1][k]==1&&ans[j].data[0][k]==1))
47                     g[i][j]=g[j][i]=1;
48 }
49 bool Find(int x) {
50     for(int i=1; i<=P; ++i) {
51         if(g[x][i]&&!vis[i]) {
52             vis[i]=1;
53             if(!who[i]||Find(who[i])) {
54                 who[i]=x;
55                 return true;
56             }
57         }
58     }
59     return false;
60 }
61 void slove() {
62     int sum=0;
63     for(int i=1; i<=P; ++i) {
64         memset(vis,0,sizeof(vis));
65         if(Find(i)) sum++;
66     }
67     cout<<P-sum/2<<endl;
68 }
69 int main() {
70     while(cin>>N>>M>>P) {
71         read();
72         slove();
73     }
74     return 0;
75 }

时间: 2024-10-09 11:24:02

hdu 3829 Cat VS Dog 二分匹配 最大独立点集的相关文章

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

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

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 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 5093 Battle ships 最大二分匹配

Battle ships Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 589    Accepted Submission(s): 233 Problem Description Dear contestant, now you are an excellent navy commander, who is responsible

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 - 1045 Fire Net(二分匹配)

Description Suppose that we have a square city with straight streets. A map of a city is a square board with n rows and n columns, each representing a street or a piece of wall. A blockhouse is a small castle that has four openings through which to s