解题:HEOI 2012 朋友圈
因为$A$中只有奇偶性不同的人才能做朋友,所以A中只可能出0/1/2个人,分类讨论
然后$B$中求最大团,转成补图后正好是个二分图(不然就不用做了),求最大点独立集=总点数-最大匹配
我洛谷上交的时候建边的时候制杖了,成了$O(n^2m^2)$建边,还好数据水跑不满+网络流跑得快900ms救回来了,估计BZOJ肯定gg了,正确的做法是直接对B全部建然后走边的时候判一下
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,M=,inf=1e9;
int p[N],from[M],noww[M],goal[M],flw[M],flow[M];
int a[N],b[N],pp[N],ch[N],dep[N],que[N];
int T,n,m,s,t,fr,bk,q,t1,t2,cnt,ans;
vector<int> ve[N];
vector<int> ::iterator it;
bool Odd(int x){return x&;}
bool Even(int x){return !(x&);}
int Bitcount(int x)
{
int ret=;
while(x)
ret++,x-=x&-x;
return ret;
}
void Link(int f,int t,int v)
{
noww[++cnt]=p[f],p[f]=cnt,from[cnt]=f;
goal[cnt]=t,flw[cnt]=flow[cnt]=v;
noww[++cnt]=p[t],p[t]=cnt,from[cnt]=t;
goal[cnt]=f,flw[cnt]=flow[cnt]=;
}
bool Layering(int st,int ed)
{
for(int i=;i<=ed;i++)
pp[i]=p[i],dep[i]=-;
dep[st]=,que[fr=bk=]=st;
while(fr<=bk)
{
int tn=que[fr++];
for(int i=pp[tn];i;i=noww[i])
if(ch[from[i]]&&ch[goal[i]])
if(dep[goal[i]]==-&&flow[i])
dep[goal[i]]=dep[tn]+,que[++bk]=goal[i];
}
return ~dep[ed];
}
int Augmenting(int nd,int ed,int mn)
{
if(nd==ed||!mn) return mn;
int tmp=,tep=;
for(int i=pp[nd];i;i=noww[i])
if(ch[from[i]]&&ch[goal[i]])
{
pp[nd]=i;
if(dep[goal[i]]==dep[nd]+)
if(tep=Augmenting(goal[i],ed,min(mn,flow[i])))
{
flow[i]-=tep,mn-=tep;
flow[i^]+=tep,tmp+=tep;
if(!mn) break;
}
}
return tmp;
}
int Dinic_Maxflow(int st,int ed)
{
int ret=;
while(Layering(st,ed))
ret+=Augmenting(st,ed,inf);
return ret;
}
int main()
{
register int i,j,k;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&q),ans=;
for(i=;i<=n;i++) ve[i].clear();
for(i=;i<=n;i++) scanf("%d",&a[i]);
for(i=;i<=m;i++) scanf("%d",&b[i]);
for(i=;i<=q;i++)
scanf("%d%d",&t1,&t2),ve[t1].push_back(t2);
cnt=,s=m+,t=s+;
for(i=;i<=m+;i++) ch[i]=,p[i]=;
for(i=;i<=m;i++)
for(j=i+;j<=m;j++)
if(Odd(b[i]^b[j])&&Even(Bitcount(b[i]|b[j])))
Odd(b[i])?Link(i,j,):Link(j,i,);
for(i=;i<=m;i++)
Odd(b[i])?Link(s,i,):Link(i,t,);
ans=max(ans,m-Dinic_Maxflow(s,t));
for(i=;i<=n;i++)
{
int tmp=;
for(j=;j<=m;j++) ch[j]=;
for(j=;j<=cnt;j++) flow[j]=flw[j];
for(it=ve[i].begin();it!=ve[i].end();it++) tmp++,ch[*it]=;
ans=max(ans,tmp-Dinic_Maxflow(s,t)+);
}
for(i=;i<=n;i++)
for(k=i+;k<=n;k++)
if(Odd(a[i]^a[k]))
{
int tmp=;
for(j=;j<=m;j++) ch[j]=;
for(j=;j<=cnt;j++) flow[j]=flw[j];
for(it=ve[i].begin();it!=ve[i].end();it++) ch[*it]++;
for(it=ve[k].begin();it!=ve[k].end();it++) ch[*it]++;
for(j=;j<=m;j++) ch[j]==?tmp++,ch[j]=:ch[j]=;
ans=max(ans,tmp-Dinic_Maxflow(s,t)+);
}
printf("%d\n",ans);
}
return ;
}
解题:HEOI 2012 朋友圈的更多相关文章
- Leetcode547 朋友圈解题报告 (DFS
题目描述: 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指所有朋 ...
- C++之路进阶——codevs2366(朋友圈)
2366 朋友圈 2012年省队选拔赛河北 时间限制: 10 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 在很久很久以前,曾经 ...
- [LeetCode] Friend Circles 朋友圈
There are N students in a class. Some of them are friends, while some are not. Their friendship is t ...
- LeetCode 547 朋友圈
题目: 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递性.如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友.所谓的朋友圈,是指所有朋友的 ...
- Leetcode之深度优先搜索(DFS)专题-547. 朋友圈(Friend Circles)
Leetcode之深度优先搜索(DFS)专题-547. 朋友圈(Friend Circles) 深度优先搜索的解题详细介绍,点击 班上有 N 名学生.其中有些人是朋友,有些则不是.他们的友谊具有是传递 ...
- [LeetCode] 547. Friend Circles 朋友圈
There are N students in a class. Some of them are friends, while some are not. Their friendship is t ...
- QQ空间/朋友圈类界面的搭建
类似于QQ空间的布局主要是在说说信息.点赞.回复三大部分的自适应布局上. 当我们需要搭建类似QQ空间.微信朋友圈的界面的时候,可做如下操作: 创建一个对应的model类: 创建一个对应model类的f ...
- Python微信-- 分享接口(分享到朋友圈、朋友、空间)
生成JS-SDK权限验证的签名 获取signature(签名)首先要获得 1.#获得jsapi_ticket 2.#获取当前页面的url #获取当前页面的url url="{}://{}{} ...
- Apple Watch版微信来了 收发微信刷朋友圈不在话下
昨晚果粉守了一夜的Apple Watch发布会,意料中的惊喜不少,最让人兴奋的是微信成为首批支持的应用.是的,在全球拥有4.68亿月活跃用户的微信怎么可能不第一时间入驻呢?之前我们就有聊过Apple ...
随机推荐
- go语言之行--简介与环境搭建
一.Go简介 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后 ...
- python基础学习1-列表使用
python 列表相关操作方法 namelist = ['a','b','c','d','1','2','3','4'] namelist1 = ['a','b','c','d','1','2','3 ...
- VMware桥接模式连接局域网
今天尝试虚拟机直连家里的局域网,用于方便另外一台主机使用家里的虚拟机. 本次连接方式是通过桥接方式,但由于'桥接到'选项默认自动,导致无法连通,最终以下步骤完成配置: 第一步:确认本地网关地址 第二步 ...
- JS 获取每月有几周(每周五到周四算作一周)
原文地址:https://caochangkui.github.io/data-week/ 将每周五至周四算作一周,计算每月有几周,并获取到每周的起始时间. 日期格式化 Date.prototype. ...
- 软件工程第三次作业(One who wants to wear the crown, Bears the crown.)
最大连续子数组和 题目 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时定义子段和 ...
- ASP.NetCore2.0概览
微软为了统一微软平台,造就了.netStandard,不管之前的Framework还是最新的.netCore都必须支持.netStandard标准来统一各个平台的开发api. 以下是之前的微软各个 ...
- shell脚本之基础
配置启动界面 vim /etc/inittab/ init3配置网卡 重启生效system-config-network网卡配置文件vim /etc/sysconfig/network-script ...
- Mac 上flink的安装与启动
在Mac 上安装flink,需要通过Homebrew安装的 1.howmebrew的安装方式,在终端粘贴以下命令,或者去官网https://brew.sh/index_zh-cn 找到此代码复制粘贴到 ...
- Python中浅拷贝和深拷贝的区别总结与理解
单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) # 内存地址相同 a = [1,2] # ...
- 联想拯救者15-isk安装固态硬盘与系统迁移教程
一.固态选择 首先知道拯救者15-ISK是m.2接口2280尺寸,支持PCIE协议NVMe接口标准.我加装的固态是HP EX900系列250G M.2 NVMe固态硬盘. 二.开盖安装 1.拯救者15 ...