【题目大意】

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

由于落后的古代,没有电脑这个也就成了每年最大的难题,而你能帮他们求出最大朋友圈的人数吗?

【题目解析】

A国人相互为朋友的只有可能是奇数和偶数。

所以S中A国人员可能:无、1奇数、1偶数、1奇数+1偶数。

B国人相互为朋友的可能是奇数和奇数、偶数和偶数、部份奇数和偶数。

所以B国人朋友关系的补图只有可能是奇数和偶数。是一个二分图。

补图的最大独立集就是是原图中的最大团。

二分图上的最大独立集 = 点数 - 最大匹配。

所以可以枚举上述情况,看选哪个A国人,然后把B国中的、被选择A国人的朋友中建补图,求最大匹配。

看众多大佬用时间戳代替memset。我不会。

#include <bits/stdc++.h>
#define FOPI freopen("in.txt", "r", stdin);
#define FOPO freopen("out.txt", "w", stdout);
using namespace std;
typedef long long LL;
const int maxn = + ;
int x, y;
int lnk[maxn], vis[maxn], del[maxn];
int a[maxn], b[maxn];
vector<int> v[maxn], odd, even;
vector<int> frd[maxn];
int A, B, m; void build(int x, int y)
{
v[x].push_back(y), v[y].push_back(x);
} bool check(int x, int y)
{
if ((x ^ y) % == ) return true;
int cnt = , tmp = x | y;
while(tmp)
{
cnt += tmp % ;
tmp >>= ;
}
return cnt % ;
} bool dfs(int k)
{
int sz = v[k].size();
for (int i = ; i < sz; i++)
{
if (!vis[v[k][i]] && del[v[k][i]])
{
vis[v[k][i]] = ;
if (lnk[v[k][i]] == - || dfs(lnk[v[k][i]]))
{
lnk[v[k][i]] = k;
return true;
}
}
}
return false;
} int hungary(int s = , int t = , int sum = )
{
int cnt = ;
memset(del, , sizeof(del));
if (s) for (int i = ; i < frd[s].size(); i++) del[frd[s][i]]++;
if (t) for (int i = ; i < frd[t].size(); i++) del[frd[t][i]]++; for (int i = ; i <= B; i++) cnt += del[i] = del[i] == sum; for (int i = ; i <= B; i++) v[i].clear(); for (int i = ; i <= B; i++)
for (int j = i+; j <= B; j++)
if (del[i] && del[j] && !check(b[i], b[j])) build(i, j); int res = ;
memset(lnk, -, sizeof(lnk));
for (int i = ; i <= B; i++)
{
memset(vis, , sizeof(vis));
if (del[i] && dfs(i)) res++;
}
return cnt - res / ;
} int main()
{
//FOPI; scanf("%d%d%d", &A, &B, &m);
for (int i = ; i <= A; i++)
{
scanf("%d", &a[i]);
if (a[i] % ) odd.push_back(i); else even.push_back(i);
} for (int i = ; i <= B; i++) scanf("%d", &b[i]); for (int i = ; i <= m; i++)
{
scanf("%d%d", &x, &y);
frd[x].push_back(y);
} int ans = hungary(); for (int i = ; i < odd.size(); i++) ans = max(ans, hungary(odd[i], , ) + ); for (int i = ; i < even.size(); i++) ans = max(ans, hungary(even[i], , ) + ); for (int i = ; i < odd.size(); i++)
for (int j = ; j < even.size(); j++)
ans = max(ans, hungary(odd[i], even[j], ) + ); printf("%d\n", ans);
}

BZOJ - 2744 朋友圈 (二分图上的最大团)的更多相关文章

  1. 【BZOJ 2744 朋友圈】

    Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1570  Solved: 532[Submit][Status][Discuss] Descripti ...

  2. bzoj 2744 朋友圈

    题目大意: 两个国家 各有A和B个人,每个人有一个数值. 若两个A国的人满足$val_i\space xor \space val_j \mod 2 =1$ 则他们为朋友 若两个B国的人满足$val_ ...

  3. bzoj 2744: [HEOI2012]朋友圈 二分图匹配

    2744: [HEOI2012]朋友圈 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 612  Solved: 174[Submit][Status] ...

  4. bzoj2744 [HEOI2012]朋友圈——二分图匹配

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2744 首先,求一个图的最大团等价于求它的补图的最大独立集,而二分图的最大独立集 = 总点数 ...

  5. Java实现 LeetCode 547 朋友圈(并查集?)

    547. 朋友圈 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指 ...

  6. PTA 朋友圈 (25 分) 代码详解 (并查集)

    1.题目要求: 某学校有N个学生,形成M个俱乐部.每个俱乐部里的学生有着一定相似的兴趣爱好,形成一个朋友圈.一个学生可以同时属于若干个不同的俱乐部.根据"我的朋友的朋友也是我的朋友" ...

  7. vue实现微信分享朋友圈和朋友功能

    vue实现微信分享朋友圈和朋友功能 A-A+ haibao  2018-10-25  11  21  6.2 k  百度已收录  前端开发 温馨提示:本文共3536个字,读完预计9分钟. 这两天在开发 ...

  8. 【BZOJ 2744】 2744: [HEOI2012]朋友圈 (最大团,二分图匹配,构图)

    2744: [HEOI2012]朋友圈 Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他 ...

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

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

随机推荐

  1. 文本编辑简体中文专业版EmEditor Professional v12.0.8(12/27/2012更新)姓名+注册码

    这是一个简单好用的文本编辑器,支持多种配置,自定义颜色.字体.工具栏.快捷键设置,可以调整行距,避免中文排列过于紧密,具有选择文本列块的功能(按ALT 键拖动鼠标),并允许无限撤消.重做,总之功能多多 ...

  2. Handler: Service中使用Toast

    Handler 的使用在 android App 开发中用的颇多,它的作用也很大,使用 Handler 一般也会使用到多线程,相信大家对 Handler 不会陌生,在这里,重点说一下 android ...

  3. java 基础 01 变量和注释、数据类型

    1,变量和注释 比如:姓名:xiaoming 年龄:18 1.1变量的基本概念 当需要在程序中记录单个数据内容时,则需要声明一个变量来处理,而变量的本质就是内存中申请一块存储单元用于存储数据内容,由于 ...

  4. 深入剖析javaScript中的深拷贝和浅拷贝

    如何区分深拷贝与浅拷贝,简单来说,假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝:我们先看两个简单的案例: //案例1(深拷贝) var a ...

  5. (已解决)Arduino mega2560 R3插在电脑上没有反应

           OK,话不多说.网上找了一些资料,感觉都说的不够清晰.自己琢磨了下,有了一个简单粗暴的方法. 步骤1:插上Arduino mega2560板子.没有反应. 步骤2:我的电脑-管理-设备管 ...

  6. Java开发工具IntelliJ IDEA创建Andriod项目示例说明

    IntelliJ IDEA社区版作为一个轻量级的Java开发IDE,是一个开箱即用的Android开发工具. 注意:在本次的教程中我们将以Android平台2.2为例进行IntelliJ IDEA的使 ...

  7. Payoneer个人账户注册申请教程

    1)照牛排于2013年末写的<免费申请Payoneer万事达预付卡+美国银行账号教程>非常详尽,网友纷纷转载,但生命在于折腾,Payoneer官网几经改版,自2015年3月推出无卡账户以来 ...

  8. innerHTML和outerHTML的区别

    一.区别:1)innerHTML: 从对象的起始位置到终止位置的全部内容,不包括Html标签.2)outerHTML: 除了包含innerHTML的全部内容外, 还包含对象标签本身. 二.例子: &l ...

  9. 可以让表格变为拖动边界调整列宽度的JS办法

    需要引入文件: jquery.resizableColumns.min.js 和 jquery.resizableColumns.css 代码如下: $(".tableclass" ...

  10. codeforce 599B Spongebob and Joke

    一道水题WA那么多发,也是醉了.f看成函数的话,其实就是判断一下反函数存不存在. 坑点,只能在定义域内判断,也就是只判断b[i].没扫一遍前不能确定Impossible. #include<bi ...