【BZOJ 2744】 2744: [HEOI2012]朋友圈 (最大团,二分图匹配,构图)
2744: [HEOI2012]朋友圈
Description
在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着。一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大数目。两个国家看成是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 是朋友
由于落后的古代,没有电脑这个也就成了每年最大的难题,而你能帮他们求出最大朋 友圈的人数吗?
Input
第一行t<=6,表示输入数据总数。接下来t个数据:第一行输入三个整数A,B,M,表示A国人数、B国人数、AB两国之间是朋友的对数;第二行A个数ai,表示A国第i个人的友善值;第三行B个数bi,表示B国第j个人的友善值;第4——3+M行,每行两个整数(i,j),表示第i个A国人和第j个B国人是朋友。Output
输出t行,每行,输出一个整数,表示最大朋友圈的数目。Sample Input
2 4 7
1 2
2 6 5 4
1 1
1 2
1 3
2 1
2 2
2 3
2 4Sample Output
5
【样例说明】
最大朋友圈包含A国第1、2人和B国第1、2、3人。HINT
【数据范围】
两类数据
第一类:|A|<=200 |B| <= 200
第二类:|A| <= 10 |B| <= 3000
【分析】
%%%大颓果:http://blog.csdn.net/u010336344/article/details/56287207
普通的最大团貌似是NPC问题??
所以这题一定有特殊性质?
A国不奇偶的认识,明显最多只能选2个人。
B过同奇同偶的认识,如果认识的连边,那么有两个完全图,又有or什么的也是朋友,所以两个团中间还有边。
那么其实可以建反图求最大点独立集。
A国的小朋友的影响就直接枚举就好了。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 3010 int mymax(int x,int y) {return x>y?x:y;} int a[Maxn],b[Maxn]; struct node
{
int x,y,next;
}t[Maxn*Maxn];
int first[Maxn],len; void ins(int x,int y)
{
t[++len].x=x;t[len].y=y;
t[len].next=first[x];first[x]=len;
} int bx[Maxn],by[Maxn];
bool vis[Maxn];
bool eg[Maxn][Maxn]; int chw[Maxn],match[Maxn]; bool ffind(int x,int nt)
{
for(int i=first[x];i;i=t[i].next) if(chw[t[i].y]!=nt&&vis[t[i].y])
{
int y=t[i].y;
chw[y]=nt;
if(match[y]==||ffind(match[y],nt))
{
match[y]=x;
return ;
}
}
return ;
} int get_ans()
{
int ans=,nt=,h=;
for(int i=;i<=bx[]+by[];i++) if(vis[i]) h++;
memset(chw,,sizeof(chw));
memset(match,,sizeof(match));
for(int i=;i<=bx[];i++) if(vis[bx[i]])
{
nt++;
if(ffind(bx[i],nt)) ans++;
}
return h-ans;
} bool check(int x)
{
int nw=;
while(x)
{
if(x&) nw++;
x>>=;
}
return nw&;
} int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
for(int i=;i<=m;i++) scanf("%d",&b[i]);
bx[]=by[]=;
for(int i=;i<=m;i++) if(b[i]&) bx[++bx[]]=i;
for(int i=;i<=m;i++) if(!(b[i]&)) by[++by[]]=i;
for(int i=;i<=bx[];i++)
for(int j=;j<=by[];j++)
{
if(!check(b[bx[i]]|b[by[j]])) ins(bx[i],by[j]);
}
for(int i=;i<=m;i++) vis[i]=;
int ans=get_ans(); memset(eg,,sizeof(eg));
for(int i=;i<=k;i++)
{
int x,y;
scanf("%d%d",&x,&y);
eg[x][y]=;
} for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++) vis[j]=eg[i][j];
ans=mymax(ans,get_ans()+);
for(int j=;j<=m;j++) vis[j]=;
}
for(int i=;i<=n;i++)
{
for(int ii=i+;ii<=n;ii++) if((a[i]&)^(a[ii]&))
{
for(int j=;j<=m;j++) vis[j]=eg[ii][j]&eg[i][j];
ans=mymax(ans,get_ans()+);
for(int j=;j<=m;j++) vis[j]=;
}
}
printf("%d\n",ans);
return ;
}
数据弱??一个很明显的错一开始还是AC了。。
2017-02-21 17:20:50
【BZOJ 2744】 2744: [HEOI2012]朋友圈 (最大团,二分图匹配,构图)的更多相关文章
- 【BZOJ 2744 】[HEOI2012]朋友圈
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...
- BZOJ2744:[HEOI2012]朋友圈(最大团,乱搞)
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...
- luogu P2423 [HEOI2012]朋友圈 (最大团)
在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着. 一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大数目.两个国家看成是 ...
- bzoj 2744: [HEOI2012]朋友圈 二分图匹配
2744: [HEOI2012]朋友圈 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 612 Solved: 174[Submit][Status] ...
- 【刷题】BZOJ 2744 [HEOI2012]朋友圈
Description 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着.一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最 ...
- 【二分图】HEOI2012 朋友圈
题目内容 洛谷链接 在很久很久以前,曾经有两个国家和睦相处,无忧无虑的生活着. 一年一度的评比大会开始了,作为和平的两国,一个朋友圈数量最多的永远都是最值得他人的尊敬,所以现在就是需要你求朋友圈的最大 ...
- BZOJ2744 HEOI2012朋友圈(二分图匹配)
先考虑B国.容易发现a xor b mod 2=0即二进制末位相同,那么可以据此将所有人分成两部分,每一部分各自是一个完全图.然后再将a or b有奇数个1的边连上,现在需要求的就是这样一个图里的最大 ...
- bzoj 2744 [HEOI2012]朋友圈——补图!+匈牙利算法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2744 求最大的团<==>补图(有边的变成没边.没边的变成有边)的最大独立集! A ...
- bzoj 2744: [HEOI2012]朋友圈
#include<cstdio> #include<iostream> #define M 3010 using namespace std; ],u[M*M>>] ...
随机推荐
- Jmeter-12-如何使用Plugin Manager
1. 搜索 Jmeter plugin 并找到plugin manager 下载jar文件 2. 放到jmeter/lib/ext下面, 重启jmeter 3. 找到选项-> Plugin ma ...
- Bzoj1312 / POJ3155 Neerc2006 Hard Life
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 459 Solved: 114 Description 在一家公司中,人事部经理与业务部经理不和.一次 ...
- ubuntu 玩转 nodejs
安装nginx 首先添加nginx_signing.key(必须,否则出错) $ wget http://nginx.org/keys/nginx_signing.key $ sudo apt-key ...
- Python作业模拟登陆(第一周)
模拟登陆:1. 用户输入帐号密码进行登陆2. 用户信息保存在文件内3. 用户密码输入错误三次后锁定用户 思路: 1. 用户名密码文件为passwd,锁定用户文件为lock 2. 用户输入账号密码采用i ...
- charger related source code position
Platform Qualcomm MSM8917 or MSM8937 Source kernel/msm-3.18/drivers/power/qpnp-smbcharger.c kernel/m ...
- ansible安装和配置
一.安装ansible准备 //安装准备 .两台机器 172.7.15.106 172.7.15.111 .设置hostname以及hosts 172.7.15.106 web9.lulu.com 1 ...
- 大小端 Big-Endian 与 Little-Endian
应该说没做底层开发(硬件或驱动)的人很可能不会彻底理解大小端的概念,大小端不是简单的一句“大端在前”还是“小端在前”能够概括的问题.在cpu, 内存, 操作系统, 编译选项, 文件,网络传输中均有大小 ...
- CF1064 E - Dwarves, Hats and Extrasensory Abilities
题意 交互题, 本来应该是在平面上进行的. 实际上换成一条直线就可以, 其实换成在平面上更复杂一些. Solution 假设\(l\)点是黑点, \(r\)处是白点, 那么就把下一个点的位置放置在\( ...
- NOIP 2013 day2
tags: 模拟 贪心 搜索 动态规划 categories: 信息学竞赛 总结 积木大赛 花匠 华容道 积木大赛 Solution 发现如果一段先单调上升然后在单调下降, 那么这一块的代价是最高的减 ...
- Java中的原子操作类
转载: <ava并发编程的艺术>第7章 当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可 ...