bzoj2744[HEOI2012]朋友圈

题目链接:bzoj2744

题目大意:

两个国家看成是AB两国,现在是两个国家的描述:

1.A国:每个人都有一个友善值,当两个A国人的友善值a、b,如果a xor b mod 2=1,那么这两个人都是朋友,否则不是;
2.B国:每个人都有一个友善值,当两个B国人的友善值a、b,如果a xor b mod 2=0 或者   (a or b)化成二进制有奇数个1,那么两个人是朋友,否则不是朋友;
3.A、B两国之间的人也有可能是朋友,数据中将会给出A、B之间“朋友”的情况。
4.在AB两国,朋友圈的定义:一个朋友圈集合S,满足S∈A∪B,对于所有的i,j∈S,i和j是朋友

求出最大朋友圈的人数


题解:

匈牙利求二分图的最大匹配

%%%[迷の想到tarjan的我ORZ...

这个题的意思是要我们求一个图的最大团。嗯。一定有特殊性质才使这道题可做。

首先观察A国人,a xor b mod 2=1,就是说当且仅当这两人一奇一偶的时候才为朋友,就是说A国的相当于一个二分图。而二分图的最大团只有2。

然后看B国人,可以发现,奇数间是个完全图,偶数间也是(在先不考虑第二个条件的情况下)。那么它的补图就是个二分图,考虑埋第二个条件也是。而在某图是个二分图的前提下,其最大独立子集就等于它补图的最大团。于是我们构图的时候就直接构造它的补图,其实就是把每对奇偶都连上..(额不要忘了去掉满足第二个条件的)。然后跑匈牙利就好了。

所以做法就是,枚举A国选多少人(0,1,2),哪些人。根据选出来的A国人选出能与所有被选到的A国人成为朋友的B国人,构图(如上所述的那样↑),上匈牙利。因为有最大独立子集=总点数-最大匹配,算出来后加上A国的人数就好了。


..我觉得我的代码还是算好懂的吧,用了时间戳。嗯。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
#define maxn 250
#define maxm 3100int A[maxn],B[maxm];
int len,lem,bf[maxm];
int ask[maxm],tim;//用时间戳
int ln[maxm],lm[maxm];
bool bk[maxm][maxm],bo[maxn][maxm];
//bk[i][j]存B国中i,j是否突破了奇偶限制而成为了朋友
int mymax(int x,int y){return (x>y)?x:y;}
bool ffind(int x)
{int i;for (i=1;i<=lem;i++)if (ask[i]!=tim && !bk[ln[x]][lm[i]])//如果成为了朋友 那么补图中他们两个是不能连边的{ask[i]=tim;if (bf[i]==-1 || ffind(bf[i])){bf[i]=x;return true;}}return false;
}
bool count(int x)
{int ret=0;while (x){if (x&1) ret++;x>>=1;}return ret&1;
}
int main()
{//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);int n,m,r,i,j,k,x,y,ia,num,ans;scanf("%d%d%d",&n,&m,&r);for (i=1;i<=n;i++)scanf("%d",&A[i]);for (i=1;i<=m;i++)scanf("%d",&B[i]);memset(bo,false,sizeof(bo));memset(bk,false,sizeof(bk));for (i=1;i<=r;i++){scanf("%d%d",&x,&y);bo[x][y]=true;}for (i=1;i<m;i++)for (j=i+1;j<=m;j++)if ((B[i]+B[j])&1){if (count(B[i]|B[j])) bk[i][j]=bk[j][i]=true;}memset(ask,0,sizeof(ask));ans=tim=0;len=lem=num=0;for (i=1;i<=m;i++)if (B[i]&1) ln[++len]=i;else lm[++lem]=i;memset(bf,-1,sizeof(bf));for (i=1;i<=len;i++){tim++;if (ffind(i)) num++;}ans=mymax(ans,len+lem-num);for (i=1;i<=n;i++){len=lem=num=0;for (j=1;j<=m;j++)if (bo[i][j]){if (B[j]&1) ln[++len]=j;else lm[++lem]=j;}memset(bf,-1,sizeof(bf));for (j=1;j<=len;j++){tim++;if (ffind(j)) num++;}ans=mymax(ans,1+len+lem-num);}for (i=1;i<n;i++)for (j=i+1;j<=n;j++) if ((A[i]+A[j])&1){len=lem=num=0;for (k=1;k<=m;k++)if (bo[i][k] && bo[j][k]){if (B[k]&1) ln[++len]=k;else lm[++lem]=k;}memset(bf,-1,sizeof(bf));for (k=1;k<=len;k++){tim++;if (ffind(k)) num++;}ans=mymax(ans,2+len+lem-num);}printf("%d\n",ans);return 0;
}


转载于:https://www.cnblogs.com/Euryale-Rose/p/6527806.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux之父为过去的言行道歉,宣布离开社区反思

9月17日&#xff0c;Linux 4.19-rc4发布&#xff0c;成为Linux 4.19最新的开发测试内核。这是现阶段一个相当常规的内核更新&#xff0c;但令人震惊的是&#xff0c;Linux之父Linus Torvalds宣布将暂时离开内核维护社区&#xff0c;Greg Kroah-Hartman将接管接下来的Linux 4.19…

[BZOJ] 1620: [Usaco2008 Nov]Time Management 时间管理

1620: [Usaco2008 Nov]Time Management 时间管理 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 850 Solved: 539[Submit][Status][Discuss]Description Ever the maturing businessman, Farmer John realizes that he must manage his time effectively. He has N jobs con…

面试-接口和纯虚类的区别

相关资料&#xff1a;1.https://zhidao.baidu.com/question/91157279.html 纯虚类:1.一个子类只能继承一个抽象类&#xff08;虚类&#xff09;。2.一个抽象类可以有构造方法。 3.一个抽象类中的方法不一定是抽象方法&#xff0c;即其中的方法可以有实现&#xff08;有方法体&a…

TCP研究

tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据 在阻塞模式下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大…

DDR工作原理

DDR SDRAM全称为Double Data Rate SDRAM&#xff0c;中文名为“双倍数据流SDRAM”。DDR SDRAM在原有的SDRAM的基础上改进而来。也正因为如此&#xff0c;DDR能够凭借着转产成本优势来打败昔日的对手RDRAM&#xff0c;成为当今的主流。本文只着重讲讲DDR的原理和DDR SDRAM相对于…

8.1 文件查找local;find使用

文件查找&#xff1a; 在文件系统上查找符合条件的文件。 文件查找&#xff1a;locate, find 非实时查找(数据库查找)&#xff1a;locate实时查找&#xff1a;find locate 1 查询系统上预建的文件索引数据库 /var/lib/mlocate/mlocate.db2 依赖于事先构建的索引 索引的构建是在…

hdu 5273 Dylans loves sequence 逆序数 区间dp

点击打开链接 题意&#xff1a;给n个数&#xff0c;q次询问&#xff0c;&#xff08;L&#xff0c;R&#xff09;区间内的逆序数。 思路&#xff1a; 区间dp 代码一&#xff1a; 1 #include <bits/stdc.h>2 using namespace std;3 typedef long long ll;4 const int maxn…

python第三天习题

# 1. 文件a.txt内容&#xff1a;每一行内容分别为商品名字&#xff0c;价钱&#xff0c;个数&#xff0c;求出本次购物花费的总钱数# apple 10 3# tesla 100000 1# mac 3000 2# lenovo 30000 3# chicken 10 3## 2. 修改文件内容&#xff0c;把文件中的alex都替换成SB# with ope…

智能故事机方案简介

智能故事机&#xff0c;又叫WiFi故事机&#xff0c;AI故事机&#xff0c;通过WiFi联网&#xff0c;用户语音就可以跟它进行问答、点歌等互动&#xff1b;由于联网所以可以播放云端海量的儿童音频内容&#xff1b;手机端在微信公众号或者专属APP上操作&#xff0c;可以点播相应内…

使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题

使用TCP套接字时&#xff0c;当无网络连接时&#xff0c;还会继续send&#xff0c;继续recv阻塞&#xff0c;知道TCP自己协议机制判断断开连接时才会停止发送和接收&#xff0c;时间需要几分钟之久。解决的办法是&#xff0c;自己设置接收超时时间&#xff0c;当超时后重新发送…

关于SpringCloud、SpringBoot 希望这是说得最详细的

几年前&#xff0c;没几个jar冲突一下都不叫搭框架 —— java面试必修 什么是Spring Boot 用我的话来理解&#xff0c;Spring Boot就是整合了框架的框架&#xff0c;它让一切依赖都变得有序简单&#xff0c;你不用操心A.jar是什么版本&#xff0c;又依赖哪些版本的jar&#xff…

weui-switch开关控件,表单提交后如何取值

最近在学习weui这个框架&#xff0c;做了一些小的试验&#xff0c;发现weui-switch控件直接提交不能获取到表单信息&#xff0c;在segmentfault上发现也有人提了这个问题&#xff0c;有人说可以设置一个隐含标签来捕获开关的状态&#xff0c;试了一下&#xff0c;确实可以&…

麦克风设计指导与选型参考

随着语音识别技术的成熟&#xff0c;智能音箱类产品的火爆&#xff0c;越来越多的产品可以升级为语音交互产品&#xff1b; 下面简单介绍下此类产品的语音前端--麦克风阵列设计相关注意事项&#xff1a; 线性四麦阵列构型&#xff1a;如上图所示&#xff0c;麦克风直线等距摆…

[BZOJ1419] Red is good(期望DP)

传送门 逆推 只不过顺序还是顺着的&#xff0c;思想是逆着的 f[i][j]表示还剩下i张红牌&#xff0c;j张黑牌的期望值 那么边界是 f[i][0]i&#xff0c;因为只剩i张红牌 f[0][j]0&#xff0c;只剩黑牌&#xff0c;显然直接停止最优 f[i][j] max(0,i/(ij)*f[i-1][j]j/(ij)*f[i][…

Linux下高性能网络编程中的几个TCP/IP选项_SO_REUSEADDR、SO_RECVBUF、SO_SNDBUF、SO_KEEPALIVE、SO_LINGER、TCP_CORK、TCP_NODE

最近在新的平台上测试程序&#xff0c;以前一些没有注意到的问题都成为了性能瓶颈&#xff0c;通过设置一些TCP/IP选项能够解决一部分问题&#xff0c;当然根本的解决方法是重构代码&#xff0c;重新设计服务器框架。先列出几个TCP/IP选项&#xff1a; 选项 man 7 socket: SO_R…

云计算在未来一定是不可或缺的

2019独角兽企业重金招聘Python工程师标准>>> 在2018京东云合作伙伴大会上&#xff0c;京东云总裁申元庆表示&#xff0c;技术发展的大趋势是“分久必合&#xff0c;合久必分”循环往复的波动&#xff0c;近十年来云计算的发展将算力、存储、带宽全部集中在中央部分&…

智能音箱 之 音频通路质量--测试与参数

一、概述 当将语音识别算法接入到设备时&#xff0c;务必要保证设备的音频通路具有足够的质量。因此对设备进行音频测试&#xff0c;以评估能够影响语音识别性能的音频前端的音频参数。如下要点对语音识别至关重要&#xff1a; 自然声音合适的增益良好的信噪比一致的响应&…

关于Linux路由表的route命令

转自&#xff1a;http://www.cnblogs.com/gunl/archive/2010/09/14/1826234.html 查看 Linux 内核路由表 使用下面的 route 命令可以查看 Linux 内核路由表。 # route Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * …

Python学习 - 常用模块(二)

目录 一. 常用模块 - hashlib 二. 常用模块 - hmac 三. 常用模块 - logging 四. 常用模块 - re 五. 常用模块 - requests 六. 常用模块 - paramiko 一. 常用模块 - hashlib hash: 一种算法, 3.x里代替了md5模块和sha模块, 主要提供 SHA1, SHA224, SHA256, SHA384, SHA512, MD5 …

select函数分析

Select在Socket编程中还是比较重要的&#xff0c;可是对于初学Socket的人来说都不太爱用Select写程序&#xff0c;他们只是习惯写诸如connect、accept、recv或recvfrom这样的阻塞程序&#xff08;所谓阻塞方式block&#xff0c;顾名思义&#xff0c;就是进程或是线程执行到这些…