题面:


得分情况:
35分枚举全排列暴力。。。


正解:
我们将直接与1相连的点称为a,不与1直接相连而与a直接相连的点称为b。
状压dp[i]表示已选的a,转移时枚举现在要选的a点,计算对答案的影响。(之前已选的点不管怎么排影响都已经计算过了)复杂度为O(2A∗B)O(2A∗B)O(2^A*B)(A,B表示a,b点的个数),能拿到70分。
对于剩下的点,我们选取A,B中较小的来作为状态,如果选到了b点则类似地转移,复杂度为O(2min(A,B)∗max(A,B))O(2min(A,B)∗max(A,B))O(2^{min(A,B)}*max(A,B)),能过掉所有数据。


代码:

#include <bits/stdc++.h>
using namespace std;const int inf=1e5;
int dp[1<<23],map1[50][50],id[50];
long long con[50],dev[50];
int c0,c1,n,m,ans;int main()
{
//    freopen("friends.in","r",stdin);
//    freopen("friends.out","w",stdout);scanf("%d%d",&n,&m);memset(map1,-1,sizeof(map1));memset(id,-1,sizeof(id));for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);scanf("%d",&map1[x-1][y-1]);map1[y-1][x-1]=map1[x-1][y-1];}for(int i=1;i<n;i++) if(map1[0][i]!=-1){id[i]=c0++;ans+=map1[0][i]^1;for(int j=1;j<n;j++){if(map1[0][j]==-1&&map1[i][j]!=-1){if(id[j]==-1) id[j]=c1++;con[id[i]]|=1ll<<id[j];dev[id[i]]|=(long long)(map1[0][i]^map1[i][j]^1)<<id[j];}}}if(c0<=20){for(int i=0;i<(1<<c0);i++) dp[i]=-inf;dp[0]=0;for(int i=0;i<(1<<c0);i++) if(dp[i]>=0){long long cur=0;for(int j=0;j<c0;j++) if((((i)>>(j))&1)==1) cur|=con[j];for(int j=0;j<c0;j++) if((((i)>>(j))&1)==0){int next=i|(1<<j),num=dp[i]+__builtin_popcountll(dev[j]&(~cur));if(dp[next]<num) dp[next]=num;}}ans+=dp[(1<<c0)-1];}else{for(int i=0;i<(1<<c1);i++) dp[i]=-inf;dp[0]=0;for(int i=0;i<(1<<c1);i++) if(dp[i]>=0){for(int j=0;j<c0;j++) if((i|con[j])!=i){int next=(i|con[j]),num=dp[i]+__builtin_popcountll(dev[j]&(~i));if(dp[next]<num) dp[next]=num;}}ans+=dp[(1<<c1)-1];}printf("%d\n",ans);return 0;
}

NOI2018湖北省队集训Day4 T2 djq 的朋友圈相关推荐

  1. NOI2018湖北省队集训Day4 T1 djq和MZ

    题面: 得分情况: 40分,写了纯暴力. 正解: 其实O(nn−−√logn)O(nnlog⁡n)O(n\sqrt{n}\log{n})的做法还挺好想的(然而我在考场上并没有想出来),分块莫队再用线段 ...

  2. JZOJ 6316. djq的朋友圈(状压DP)

    JZOJ 6316. djq的朋友圈 题目 Description Input Output 一个整数表示最多的盟友数. Sample Input Sample 1: 7 8 1 2 0 1 3 0 ...

  3. FJ省队集训DAY4 T1

    直接上题解 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstr ...

  4. FJ省队集训DAY2 T2

    思路:我们可以考虑三角剖分,这样问题就变成考虑三角形的选取概率和三角形内有多少个点了. 先用树状数组预处理出三角剖分的三角形中有多少个点,然后用线段树维护,先用原点极角排序,然后枚举i,再以i极角排序 ...

  5. 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 ...

  6. JZOJ 6316. djq的朋友圈

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

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

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

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

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

  9. 【动态规划 状压dp】JZOJ_6316 djq的朋友圈

    题意 给出一张图,有若干点之间连边,边权∈{0,1}\in\{0,1\}∈{0,1},对于点1,与它直接连边的点且边权为0,就是盟友,否则是情敌:间接连边,就要按某种顺序同时列出它们的熟人,如果关系相 ...

最新文章

  1. 文件逆序改为正序脚本
  2. 四维偏序 CDQ套CDQ
  3. 前端学习(2556):vue插槽
  4. 2017.10.25 书柜的尺寸 失败总结
  5. php pod模式,k8s pod的4种网络模式最佳实战(externalIPs )
  6. linux resin mysql_【转】Linux下Resin+JSP+MySQL的安装和配置
  7. [Z]Java Architecture for XML Binding (JAXB)
  8. tab切换中的滚动条下拉分页带来的问题
  9. logback.xml日志文件常用配置模板文件详解
  10. 微信开发-点击链接自己主动加入关注
  11. Java Web开发的轻便架构Tapestry5---简介
  12. java 旅游网站项目实现_基于jsp的旅游网站a-JavaEE实现旅游网站a - java项目源码
  13. vue 百度地图获取经纬度地址
  14. 如何构建用户评分体系
  15. 原声JS瀑布流加延迟加载
  16. Gentler编程简介
  17. 火狐Firefox浏览器安装使用油猴Tampermonkey插件
  18. 福利来了,企业信息化应用云服务免费自助开通
  19. 多所院校发布研究生补录通知!
  20. JPEGLS图像压缩算法的FPGA实现(一)压缩算法

热门文章

  1. AMD新旧驱动大起底,今年的AMD有点忙
  2. python实现将json字幕转srt
  3. 小棉猫打印插件使用说明
  4. 选择应该会从这里开始改变你,眼袋
  5. 数仓工具—Hive实战之对比分析(15)
  6. 2021考研408计算机百度云,2021考研科目:改成统考408计算机综合的学校有哪些?
  7. Kindle剩余空间变少
  8. 算法进阶系列1 空间搜索 GeoHash 算法
  9. 对C++程序内存管理的精雕细琢
  10. 求1到N中质数的个数