【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>>] ...
随机推荐
- 【BZOJ4818】【SDOI2017】序列计数 [矩阵乘法][DP]
序列计数 Time Limit: 30 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Alice想要得到一个长度为n的序 ...
- codechef September Challenge 2017 Fill The Matrix
这道题我们发现0就代表相同1代表少1或者大1 那么我们根据题目连边 如果存在1(边权只为或0)个数为奇数的环就是无解 #include<cstdio> #include<cstrin ...
- 快速搭建 DNS 服务器: skydns + etcd
参考: [ skynetservice github ] [ skydns 测试记录 CSDN ] etcd 安装配置 安装 yum install etcd 配置 sed -i 's@ETCD_LI ...
- nmap导出处理脚本
import sys log = open("result.gnmap","r") xls = open("output.csv",&quo ...
- Python模块学习 - pyinotify
pyinotify介绍 pyinotify模块用来监测文件系统的变化,依赖于Linux内核的inotify功能,inotify是一个事件驱动的通知器,其通知接口从内核空间到用户空间通过三个系统调用.p ...
- python基础===理解Class的一道题
解题如下: from random import randint class Die(): def __init__(self,sides=6): self.sides = sides def rol ...
- 用__builtin_return_address获得程序运行栈情况【转】
转自:http://blog.csdn.net/vpwork/article/details/7680102 %pF versatile_init+0x0/0x110 %pf versatile_in ...
- pam_examples
blank.c /* * $Id$ */ /* Andrew Morgan (morgan@parc.power.net) -- a self contained `blank' * applicat ...
- CentOS安装按进程实时统计流量情况工具NetHogs笔记
CentOS安装按进程实时统计流量情况工具NetHogs笔记 一.概述 NetHogs是一款开源.免费的,终端下的网络流量监控工具,它可监控Linux的进程或应用程序的网络流量.NetHogs只能实时 ...
- ConcurrentHashMap的使用
http://blog.csdn.net/gjt19910817/article/details/47353909 Long oldValue, newValue; while(true) { old ...