JZOJ 6316. djq的朋友圈

题目

Description

Input

Output

一个整数表示最多的盟友数。

Sample Input

Sample 1:
7 8
1 2 0
1 3 0
2 4 0
4 5 0
3 4 1
2 5 1
5 7 1
1 7 1

Sample 2:
8 24
5 8 1
6 3 1
2 8 0
4 6 1
4 1 1
2 3 1
5 4 1
5 1 0
2 6 0
1 3 0
8 7 1
8 4 1
1 7 1
7 2 1
8 1 1
3 4 0
3 7 0
7 6 0
5 2 0
6 1 1
5 3 0
5 7 1
6 5 0
6 8 0

Sample Output

Sample 1:
4

Sample 2:
3

Data Constraint


Hint

样例1 中,如果顺序为“7,2,3”,可以使得 2,3,4,5 都和 djq 成为盟友。

题解

  • 这题的题意看起来有点复杂。。。
  • 首先可以发现,与111最短距离大于222的点最后一定是不确定的,所以忽略它们,
  • 设集合AAA为所有与111有边相连的点,也就是最初已经确定的,
  • 集合BBB为所有在AAA集合外且不为111的与AAA集合任意点相邻的点,也就是能间接确定的,
  • 其它的都没法确定。
  • 现在只用考虑从AAA集合中选点的顺序,
  • 对于70%70\%70%的数据,直接状压当前AAA集合中已经选过的点,
  • 每次枚举一个状态,将已经选过的点所能连向的所有在BBB中的点标记,标记的就是被确定关系的
  • 再枚举一个还没选过的点,它所连向所有在的BBB中的点,如果还未被标记的点即可以确定关系,统计出有多少个“盟友”,更新状态。
  • 最后还要再加上AAA集合中的“盟友”。
  • 对于全部数据,做法也是类似的,
  • 如果AAA集合小于BBB集合大小,同70%70\%70%的做法,
  • 否则状压BBB中的点,做法类似,
  • 还是枚举AAA中的点,但不用判断它是否选过,只需要看它能确定多少BBB中的点,然后更新状态。
  • 最后仍然要加上AAA集合中的“盟友”。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int last[45],next[1800],to[1800],re[1800],len=0;
int nu[45],bz[45],f[2100000];
int p[45],s1[45],s2[45],r[45][45];
void add(int u,int v,int x)
{to[++len]=v;re[len]=x;next[len]=last[u];last[u]=len;r[u][v]=x;
}
int main()
{int n,m,i,j,k,u,v,x;scanf("%d%d",&n,&m);memset(r,255,sizeof(r));for(i=1;i<=m;i++){scanf("%d%d%d",&u,&v,&x);add(u,v,x),add(v,u,x);}s1[0]=s2[0]=0;for(i=last[1];i;i=next[i]) bz[to[i]]=1,s1[++s1[0]]=to[i],nu[to[i]]=s1[0];for(i=1;i<=n;i++) if(bz[i]==1)for(j=last[i];j;j=next[j]) if(!bz[to[j]]&&to[j]>1) bz[to[j]]=2,s2[++s2[0]]=to[j],nu[to[j]]=s2[0];if(s1[0]<21){memset(f,0,sizeof(f));for(i=0;i<(1<<s1[0]);i++) if(i==0||f[i]){memset(p,0,sizeof(p));for(j=1;j<=s1[0];j++) if(i&(1<<(j-1))) for(k=last[s1[j]];k;k=next[k]) if(bz[to[k]]==2) p[to[k]]=i+1;for(j=1;j<=s1[0];j++) if((i&(1<<(j-1)))==0){int s=0;for(k=last[s1[j]];k;k=next[k]) if(bz[to[k]]==2&&p[to[k]]<=i) s+=r[1][s1[j]]==re[k];f[i+(1<<(j-1))]=max(f[i+(1<<(j-1))],f[i]+s);}} int s=0;for(i=1;i<=s1[0];i++) s+=!r[1][s1[i]];printf("%d\n",f[(1<<s1[0])-1]+s);}else{memset(f,0,sizeof(f));for(i=0;i<(1<<s2[0]);i++) if(i==0||f[i]){for(j=1;j<=s1[0];j++) {int s=0,t=0;for(k=last[s1[j]];k;k=next[k]) if(bz[to[k]]==2&&!(i&(1<<(nu[to[k]]-1)))) s+=r[1][s1[j]]==re[k],t+=1<<(nu[to[k]]-1);f[i+t]=max(f[i+t],f[i]+s);}}int s=0;for(i=1;i<=s1[0];i++) s+=!r[1][s1[i]];printf("%d\n",f[(1<<s2[0])-1]+s);}return 0;
}

JZOJ 6316. djq的朋友圈(状压DP)相关推荐

  1. JZOJ 6316.djq的朋友圈【状压】

    ... 题目: 题意: 分析: 代码: 题目: 传送门 题意: 给出关系表,求一个对比的顺序,使得可能的盟友数最大 分析: 设AAA表示直接与111相连的点集,BBB表示直接与AAA相连但不与111相 ...

  2. JZOJ 6316. djq的朋友圈

    DescriptionDescriptionDescription 有nnn个点,mmm条边,点值是从点1通过边亦或和,求拟定一种加入点的顺序,使得0的点更多 数据范围:n≤42n\leq 42n≤4 ...

  3. [jzoj 6316] djq的朋友圈 {状态压缩}

    题目 解题思路 我们可以把和1号点相邻且是盟友的点归到A集合,与1号点相邻且不是盟友的归到B集合,然后枚举B集合的排列暴力计算. 代码 #include<cstdio> #include& ...

  4. 6316. djq的朋友圈

    Description Input Output 一个整数表示最多的盟友数. Sample Input Sample 1: 7 8 1 2 0 1 3 0 2 4 0 4 5 0 3 4 1 2 5 ...

  5. 【状压DP】剑之修炼(jzoj 2130)

    剑之修炼 jzoj 2130 题目大意: 在一个位置上有一个人,同时还有NNN(N⩽10N \leqslant 10N⩽10)个怪物,这个人会不停地释放技能,技能可以瞬间杀死周围8个格子上的怪物,行走 ...

  6. 【状压DP】最优配对问题(jzoj 3420)

    最优配对问题 jzoj 3420 题目大意: 在平面上有n个点,现在要把他们拼成n/2对,拼接两个点的代价是他们的平面距离,现在问代价总和最小是多少 输入样例 4 8730 9323 -3374 39 ...

  7. NOI2018湖北省队集训Day4 T2 djq 的朋友圈

    题面: 得分情况: 35分枚举全排列暴力... 正解: 我们将直接与1相连的点称为a,不与1直接相连而与a直接相连的点称为b. 状压dp[i]表示已选的a,转移时枚举现在要选的a点,计算对答案的影响. ...

  8. [蓝桥杯][算法提高VIP]Sharing Chocolate(状压dp记忆化搜索)

    题目描述 每天,巧克力在它的许多形式上被全世界数百万人分享.它是一个真正普遍的糖果,实际上在世界上每个国家都能得到. 你发现唯一比吃巧克力更好的事情是把它分享给朋友.不幸的是,你的朋友非常挑剔,有着不 ...

  9. 【Gym - 101915D】Largest Group(二分图最大团,状压dp)

    题干: 大黑山上有小小民和小小涛两种物种,山东人小李想要研究这两种物种的关系 奇怪的是大黑山上有相同数量的小小民和小小涛.小李数了数一共有 P 个,小李分别给P个小小民和小小涛编号 1 - P 号,已 ...

最新文章

  1. Py之mpld3:mpld3的简介、安装、使用方法之详细攻略
  2. 云原生环境下对“多活”架构的思考
  3. 第二讲 命令源码文件
  4. [html] 你喜欢哪种布局风格?说说你的理由
  5. 黑夜主权个人团队html源码 简单修改即可使用
  6. java fork join demo_Fork/Join框架 demo
  7. 【转】linux shell 逻辑运算符、逻辑表达式详解
  8. java kind con,java.lang.ClassNotFoundException:afu.com.sun.source.tree.tree$kind
  9. 全新一代智慧园区数字孪生解决方案,为园区运营商和集成商赋能
  10. 计算机控制技术廖道争答案,2017年三峡大学电气与新能源学院专业目录及考试科目...
  11. 京东商城网页数据爬取
  12. 牛客 打气球的最大分数
  13. Linux实战(20):Docker部署EKL入门环境记录文档
  14. Markdown/LaTeX数学符号、公式大全(一)
  15. Office 365入门教程(一):开始使用Office 365
  16. 安装es-header插件
  17. 半年总结——燕雀鸿鹄皆有志
  18. 【机器学习】22个开源的机器学习库,帮助您选择一个适合您的管道工具。
  19. 传统企业建企业网站应当懂得借助外力
  20. 数字图像处理100问—40 JPEG 压缩——第四步:YCbCr+离散余弦变换+量化

热门文章

  1. 大专计算机专业可以在职研究生吗,专科可以报考西安邮电大学计算机在职研究生吗?...
  2. vscode常用配置
  3. 客户关系管理电子商务忠诚度
  4. 深度学习:使用卷积网络实现计算机图像识别,卷积和max pooling操作介绍
  5. 注册表-各种功能-隐藏IE、隐藏硬盘、禁用硬件
  6. 本地html在线打包apk,HTML一键打包APK工具使用及配置方法
  7. c语言中的类结构体-点号
  8. “全国大学生计算机等级考试一级”英语翻译
  9. JavaScript赋值运算符
  10. 简单聊聊 Perlin 噪声(下篇)