题解 \(by\;zj\varphi\)

首先发现一共最多只有 \(2^d\) 种道路,那么可以状压,(不要 \(dfs\),会搜索过多无用的状态)

那么设 \(f_{i,j,k}\) 为走 \(i\) 步,走到 \(j\),状态为 \(k\) 是否可行,那么转移就是 \(\mathcal O\rm (n^22^n)\),过不了

有一种技巧,叫 \(\rm meet\;in\;the\;middle\),从中间折半,设 \(f_{i,j,k}\) 表示由 \(1\) 出发,走 \(i\) 步到 \(j\),状态为 \(k\) 是否可行

\(g_{i,j,k}\) 表示以任意一个点为起点,其余同上

那么最终只要将两种状态拼起来即可,复杂度是 \(\mathcal O\rm (n^2*2^\frac{n}{2}+2^n)\)

注意,需要判断奇数折半的情况

Code
#include<bits/stdc++.h>
#define ri register signed
#define p(i) ++i
using namespace std;
namespace IO{
char buf[1<<21],*p1=buf,*p2=buf;
#define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++
template<typename T>inline void read(T &x) {
ri f=1;x=0;register char ch=gc();
while(ch<'0'||ch>'9') {if (ch=='-') f=0;ch=gc();}
while(ch>='0'&&ch<='9') {x=(x<<1)+(x<<3)+(ch^48);ch=gc();}
x=f?x:-x;
}
}
using IO::read;
namespace nanfeng{
#define pb(x) push_back(x)
#define FI FILE *IN
#define FO FILE *OUT
template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
static const int N=92;
bitset<1<<11> bit[12][N],bt[N];
bitset<2> eg[N][N];
int first[N],vis[1<<21],n,m,d,t=1,hd,ans;
struct edge{int v,nxt,c;}e[N*N<<1];
vector<int> sta[N],st2[N];
inline void add(int u,int v,int c) {
e[t].v=v,e[t].c=c,e[t].nxt=first[u],first[u]=t++;
e[t].v=u,e[t].c=c,e[t].nxt=first[v],first[v]=t++;
}
inline int main() {
// FI=freopen("nanfeng.in","r",stdin);
// FO=freopen("nanfeng.out","w",stdout);
read(n),read(m),read(d);
hd=d>>1;
for (ri i(1),u,v,c;i<=m;p(i)) {
read(u),read(v),read(c);
if (eg[u][v][c]) continue;
eg[u][v][c]=eg[v][u][c]=1;
add(u,v,c);
}
bit[0][1][0]=1;
for (ri i(0);i<hd;p(i)) {
int S=(1<<i)-1;
for (ri j(0);j<=S;p(j))
for (ri k(1);k<=n;p(k)) {
if (!bit[i][k][j]) continue;
for (ri ed(first[k]);ed;ed=e[ed].nxt) {
ri cst=j<<1|e[ed].c;
bit[i+1][e[ed].v][cst]=1;
if (i+1==hd&&!bt[e[ed].v][cst])
sta[e[ed].v].pb(cst),bt[e[ed].v][cst]=1;
}
}
}
for (ri i(0);i<=11;p(i))
for (ri j(0);j<N;p(j)) bit[i][j].reset();
for (ri i(1);i<=N;p(i)) bt[i].reset();
if (d&1) p(hd);
for (ri i(1);i<=n;p(i)) bit[0][i][0]=1;
for (ri i(0);i<hd;p(i)) {
int S=(1<<i)-1;
for (ri j(0);j<=S;p(j))
for (ri k(1);k<=n;p(k)) {
if (!bit[i][k][j]) continue;
for (ri ed(first[k]);ed;ed=e[ed].nxt) {
ri cst=j<<1|e[ed].c;
bit[i+1][e[ed].v][cst]=1;
if (i+1==hd&&!bt[e[ed].v][cst])
st2[e[ed].v].pb(cst),bt[e[ed].v][cst]=1;
}
}
}
for (ri i(1);i<=n;p(i)) {
ri siz=sta[i].size(),sz=st2[i].size();
for (ri j(0);j<siz;p(j)) {
ri tst=sta[i][j]<<hd;
for (ri k(0);k<sz;p(k)) {
ri stt=tst|st2[i][k];
if (!vis[stt]) p(ans),vis[stt]=1;
if (ans==(1<<d)) break;
}
if (ans==(1<<d)) break;
}
if (ans==(1<<d)) break;
}
printf("%d\n",ans);
return 0;
}
}
int main() {return nanfeng::main();}

NOIP 模拟 $20\; \rm y$的更多相关文章

  1. NOIP 模拟 $20\; \rm z$

    题解 很考验思维的一道题 对于不同的任务点,发现如果 \(x_{i-1}<x_i<x_{i+1}\) 或 \(x_{i-1}>x_i>x_{i+1}\) 那么 \(x_i\) ...

  2. NOIP 模拟 $20\; \rm 玩具$

    题解 \(by\;zj\varphi\) 一道概率与期望好题 对于一棵树,去掉根后所有子树就是一个森林,同理,一个森林加一个根就是一棵树 设 \(f_{i,j}\) 为有 \(i\) 个点的树,高度为 ...

  3. NOIP 模拟 $79\; \rm y$

    题解 \(by\;zj\varphi\) NOIP2013 的原题 最简单的思路就是一个 bfs,可以拿到 \(70pts\) 75pts #include<bits/stdc++.h> ...

  4. 7.22 NOIP模拟7

    又是炸掉的一次考试 T1.方程的解 本次考试最容易骗分的一道题,但是由于T2花的时间太多,我竟然连a+b=c都没判..暴力掉了40分. 首先a+b=c,只有一组解. 然后是a=1,b=1,答案是c-1 ...

  5. NOIP模拟 1

    NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. #   用  户  名   ...

  6. 20190725 NOIP模拟8

    今天起来就是虚的一批,然后7.15开始考试,整个前半个小时异常的困,然后一看题,T1一眼就看出了是KMP,但是完了,自己KMP的打法忘的一干二净,然后开始打T2,T2肝了一个tarjan点双就扔上去了 ...

  7. 20190902+0903合集-NOIP模拟

    一直没时间写QwQ 于是补一下. Day 1 晚饭吃的有点恶心…… $1s\,2s\,5s$ 还开 -O2 ?? 有点恐怖. T1 猛的一想: 把外面设成一个点, 向入口连一条权为排队时间的边 从出口 ...

  8. 2021.5.22 noip模拟1

    这场考试考得很烂 连暴力都没打好 只拿了25分,,,,,,,,好好总结 T1序列 A. 序列 题目描述 HZ每周一都要举行升旗仪式,国旗班会站成一整列整齐的向前行进. 郭神作为摄像师想要选取其中一段照 ...

  9. NOIP 模拟 $16\; \rm Lost My Music$

    题解 \(by\;zj\varphi\) 一道凸包的题 设 \(\rm dep_u\) 表示节点 \(u\) 的深度,那么原式就可化为 \(-\frac{c_v-c_u}{dep_v-dep_u}\) ...

随机推荐

  1. ROS踩坑笔记总结

    2019-07-12 11:32:16 我的第一篇原创博客(当然是站在巨人肩膀上,有些内容参考了其他大神的博客,都一一做了说明),这些是我之前在学习ROS期间经历的一些坑,以及相对应的解决方案,希望可 ...

  2. Redhat 6.9 升级SSH到OpenSSH_8.6p1完整文档

    这个文章是转载,原文连接在这个:https://www.cnblogs.com/xshrim/p/6472679.html 这个问题遇到过,下面可以解决 ----------------------- ...

  3. Java003-String字符串

    1.这两种定义有什么区别 /*** * 面试题:这两种定义方式有什么区别? * 如何证明? * @param args */ public static void main(String[] args ...

  4. Linux账号和权限管理(第二回合)

    一.组账号文件二.添加组账号groupadd三.添加删除组成员gpasswd四.删除组账号groupdel五.查询账号信息finger六.文件/目录的权限和归属七.设置文件和目录的归属chown 一. ...

  5. c语言函数的嵌套使用和矩阵运算

    这段时间,听刚刚学习c的同学说函数嵌套运用不太熟练,想做一个简单的程序进行练习,我也就当练练手了,哈哈.虽然说是比较简单,但是其中的思维也是值得思考的. 一.函数的嵌套使用 简单说明题目:对于等式 y ...

  6. 基于SSM酒店管理系统mysql版本(前后台)

    介绍:spring,springmvc,mybatis,mysql,eclipse 截图: 数据库表:CREATE TABLE `account` ( `id` int(11) NOT NULL AU ...

  7. 【Mysql】InnoDB 引擎中的数据页结构

    InnoDB 是 mysql 的默认引擎,也是我们最常用的,所以基于 InnoDB,学习页结构.而学习页结构,是为了更好的学习索引. 一.页的简介 页是 InnoDB 管理存储空间的基本单位,一个页的 ...

  8. Unittest方法 -- 测试分离

    一.下面是it.py 脚本,把浏览器前置和后置条件分离了"""套件公用测试类可进行分离"""import unittestfrom sele ...

  9. Leetcode3.无重复字符的最长子串——简洁易懂

    > 简洁易懂讲清原理,讲不清你来打我~ 输入字符串,找到无重复.最长.子串,输出长度 ![在这里插入图片描述](https://img-blog.csdnimg.cn/c0565c943c654 ...

  10. NOI Online 提高组 题解

    来补坑了-- 个人认为三道题难度差不多-- 还有要说一嘴,为啥我在其他网站代码都好好的,复制到 cnblogs 上 Tab 就成 8 空格了?不过也懒得改了. T1 序列 首先,遇到这种加一减一还带附 ...