题解 \(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. 第二章 python基本语法元素

    python有两种编程方式,交互式和文件式. 交互式:对每个输入语句即时运行结果------适合语法练习 文件式:批量执行一组语句并运行结果------编程的主要方式 实例1:圆面积的计算(根据半径r ...

  2. Vue使用PrintJs自定义打印表格模板

    这俩天客户提了个需求,需要打印俩个自定义的表格模板,一开始想到的是打印Json表格,但是发现表格样式不符合要求,后来想着打印html,自己生成html模板然后打印,基本可以满足客户的需求,废话不多说, ...

  3. java基础---设计模式(3)

    行为型模式 出处:http://blog.csdn.net/zhangerqing 行为型模式包括策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式 ...

  4. 物理机连接虚拟机中的数据库及Windows添加防火墙允许端口详细操作步骤

    公司项目中因为会使用到SQL server数据库,但是自己电脑无论安装2008R2或者2014版本都不成功,我想可能是和之前安装的一些Windows的软件存在冲突. 于是便单独创建了一台虚拟机,在虚拟 ...

  5. 浅析VO、DTO、DO、PO的概念、区别和用处(八)

    本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: ...

  6. npm 报错 : npm ERR! Maximum call stack size exceeded

    解决方法:https://blog.csdn.net/caijunfen/article/details/81009797

  7. 浅析线程池 ThreadPoolExecutor 源码

    首先看下类的继承关系,不多介绍: public interface Executor {void execute(Runnable);} public interface ExecutorServic ...

  8. canvas的globalCompositeOperation属性

    在开发过程中遇到过类似刮刮卡的效果,就是涂抹时变透明,显示出下方的内容,做法思路简单说一下问题和解决方案: 分为2层,最下面一层是内容,比如'一等奖',上面一层用一个canvas遮挡住,画布本来是透明 ...

  9. HTML5 socket

    client: <!DOCTYPE html> <html> <head> <title></title> <meta http-eq ...

  10. 百度nlp api接口测试

    date:2021/7/8 使用postman测试 网址:https://ai.baidu.com/ 在百度AI首页-开放能力-自然语言处理-语言处理基础技术 点击技术文档 在左侧文档目录选择API参 ...