题意:P个小朋友,每个人有喜欢的动物和讨厌的动物。留下喜欢的动物并且拿掉讨厌的动物,这个小朋友就会开心。问最多有几个小朋友能开心。

分析:对于每个动物来说,可能既有人喜欢又有人讨厌,那么这样的动物实际上建立了一对矛盾关系,将其视作一条边,连接有矛盾的两个小朋友。但是这样连边的话,相当于一个小朋友拆成了两个点,重复的关系会被连两次,二分图的X部和Y部都是P个小朋友。根据这个规则建出的图,其最小点覆盖就是最后会不开心的小朋友的数量。而|最小点覆盖| = |最大匹配|,所以求出最大匹配后,再用顶点数-|最大匹配|/2,就是答案。除2是因为,同一个矛盾关系被连了两次边。实际上这个问题也就是求二分图的最大独立集。|最大独立集| =  顶点数 - |最大匹配|

#include <cstdio>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <string>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn = 5e2+;
const int maxm = maxn*maxn;
int N;
struct Edge{
int to,next;
}edges[maxm];
int head[maxn],tot;
int linker[maxn];
bool used[maxn];
int cnt; void init(){
tot=;
cnt=;
memset(head,-,sizeof(head));
} void AddEdge(int u,int v)
{
edges[tot].to = v;
edges[tot].next = head[u];
head[u] = tot++;
} bool dfs(int u){
int v,st,ed;
for(int i=head[u];~i;i = edges[i].next){
v = edges[i].to;
if(!used[v]){
used[v]=true;
if(linker[v]==-||dfs(linker[v])){
linker[v]=u;
return true;
}
}
}
return false;
} int hungary(){
int res=;
memset(linker,-,sizeof(linker));
for(int u=;u<=N;u++){ //总的点数是cnt!!!
memset(used,,sizeof(used));
if(dfs(u)) res++;
}
return res;
} string like[maxn],dis[maxn]; #define LOCAL
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int T,A,B,u,tmp,K,cas=;
while(scanf("%d%d%d",&A,&B,&N)==){
init();
for(int i=;i<=N;++i){
char op1[],op2[];
scanf("%s %s",op1,op2);
like[i]=op1;
dis[i]=op2;
}
for(int i=;i<=N;++i){
for(int j=;j<=N;++j){
if(i==j) continue;
if(like[i]==dis[j] || dis[i]==like[j]) AddEdge(i,j);
}
}
printf("%d\n",N-hungary()/); //求最大独立集
}
return ;
}

最新文章

  1. http协议笔记
  2. SharpZipLib 文件/文件夹压缩
  3. Effective Objective-C 2.0 学习记录
  4. 谈Web前端安全编码
  5. jq 拖拽
  6. tomcat简介及原理解说
  7. 创建C#串口通信程序详解
  8. c# 分页控件
  9. Fragment保持状态切换,fragment状态切换
  10. Call Transaction 小节
  11. lua简洁的功能(两)
  12. Java之IO流基础流对象
  13. Jquery文本框值改变事件(支持火狐、ie)
  14. Windows平台下的node.js安装
  15. 第一个servlet程序
  16. P5270 无论怎样神树大人都会删库跑路
  17. webform ajax 异步请求
  18. Android四大组件应用系列——Activity与Service交互实现APK下载
  19. C语言如何向系统接要存
  20. 微信小程序获取客户端系统信息

热门文章

  1. 《Start Developing iOS Apps Today》摘抄
  2. sql中between and 用法
  3. boost::interprocess::managed_shared_memory(2)(std::string)
  4. 【BZOJ3207】花神的嘲讽计划Ⅰ Hash+主席树
  5. eslint Rules
  6. cocos2d-X学习之主要类介绍:布景:CCLayer
  7. HDU 5677 ztr loves substring(回文串加多重背包)
  8. 通过创建脚本代替&quot;scrapy crawl Test&quot;命令
  9. 如何设置,使IntelliJ IDEA智能提示忽略大小写
  10. TADDConnetion组件,TADOQuery