题目链接: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

bzoj2744[HEOI2012]朋友圈相关推荐

  1. 解题报告:luogu P2423 [HEOI2012]朋友圈【最大团转最大点独立集(匈牙利算法+时间戳优化)】

    图的最大团:"任意两点之间都有一条边相连"的子图被称为无向图的团,点数最多的团为图的最大团 朋友圈中任意两个点之间都有关系,既是图中的团. 答案就是图中的最大团. 我们如果把B国的 ...

  2. 【BZOJ 2744 】[HEOI2012]朋友圈

    Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...

  3. [HEOI2012] 朋友圈(最大团 + 结论 + 二分图 + 网络流)

    problem luogu-P2423 solution 本题即求无向图最大团问题.这是个 NP hard\text{NP hard}NP hard 问题,所以必须从图的特殊性质出发,否则只能暴搜. ...

  4. luogu P2423 [HEOI2012]朋友圈 (最大团)

    在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着. 一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大数目.两个国家看成是 ...

  5. BZOJ2744洛谷P2423P2423 [HEOI2012]朋友圈

    自从有了课件,我就不想打字了 代码(交在BZOJ的时候记得把组数删掉) //By AcerMo%%%尹兄 #include<cmath> #include<cstdio> #i ...

  6. BZOJ 2744: [HEOI2012]朋友圈

    传送门 解题思路 直接跑最大团洛谷上能得70分,惊了.说说正解,首先A国的必须xor后mod2余1,就相当于两个人必须是1奇1偶,所以A国的人只能选0,1,2个,我们可以暴力枚举选谁.继续考虑B国,现 ...

  7. HEOI2012 朋友圈

    这是做的最得意的一道题,当时在考场上得了90,是因为数据中A有100++的情况,Runtime_error了.. 首先强调,本人不是用二分图,或者说不用图论算法,只涉及简单的枚举和记忆化思想. A国的 ...

  8. cogs 2620. [HEOI2012]朋友圈

    /*70分 被卡T*/ #include<iostream> #include<cstdio> #include<cstring> using namespace ...

  9. 【BZOJ】【LYDSY】【大视野】2744(【HEOI2012】)朋友圈

    Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...

最新文章

  1. mysql error number 1130,[转]mysql error number 1130的解决方法
  2. PHP文件上传和文件操作案例
  3. 驻极体,PN结以及电子管相关问题
  4. office2013安装程序找不到office.zh-cn\officeMUI.xml 最新解决方案
  5. 【爬虫笔记】Scrapy爬虫技术文章网站
  6. A+B (带有,的数字)
  7. Android Studio导入 jar包的方法
  8. J-Link该如何升级固件?
  9. python 解析器的常用options
  10. 原创 | 2020年Java程序员应该学习的10大技术
  11. 内存中的堆和栈(heap stack)
  12. 快递实名制正式实施 市民最担心个人信息泄露
  13. 知识点篇:7)企业标准体系制定要求
  14. python搭建http服务_Python搭建HTTP服务过程图解
  15. 详解Vant组件的使用
  16. matlabadftest_ADF检验matlab代码,看看啊
  17. 2021,排名前 15 的 Vue 后台管理模板
  18. golang not enough arguments in call to uuid.Must
  19. 三菱PLC模板程序FX5U轴FB块 使用ST语言编写的轴FB块,包含原点复归,点动,定位运动
  20. 夏日蚊子大又多 叮咬起包挤不得

热门文章

  1. 三相逆变器双pi控制器参数如何调节_一分钟看懂维也纳三相整流器
  2. java指针的数组_java 指针 数组的使用
  3. numpy的深复制与浅复制的区别_Python之Numpy基础,强大到让你五体投地
  4. linux应用之--网络编程
  5. Perl文件及目录操作
  6. ATLAS数学库编译
  7. 感知算法论文(八):Generalized Intersection over Union:A Metric and A Loss for Bounding Box Regression(2019)
  8. 测试回收站测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站2测试回收站
  9. 银行系普惠和小贷系普惠,哪个贷款更靠谱?
  10. python带通滤波_python中的fft带通滤波器