题解 \(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. Flask(11)- 操作 Cookie

    前言 Cookie 详解:https://www.cnblogs.com/poloyy/p/12513247.html 这一节来瞧一瞧如何用 Flask 操作 Cookie 接下来就是 实战栗子!!! ...

  2. CTF文件包含

    <?php include "flag.php"; $a = @$_REQUEST['hello']; eval( "var_dump($a);"); s ...

  3. C语言:char讲解与例子

    #include <stdio.h> main() { char bla,blb,blc;//声明或定义三个字符型变量,变量名为bla,blb,blc //字符型数据用标识符char来标识 ...

  4. LeetCode 887. Super Egg Drop

    题目链接:https://leetcode.com/problems/super-egg-drop/ 题意:给你K个鸡蛋以及一栋N层楼的建筑,已知存在某一个楼层F(0<=F<=N),在不高 ...

  5. python内置函数dir()

    描述 dir() 函数不带参数时,返回当前范围内的变量.方法和定义的类型列表:带参数时,返回参数的属性.方法列表.如果参数包含方法__dir__(),该方法将被调用.如果参数不包含__dir__(), ...

  6. MySQL -- 表联结

    创建联结:(使用WHERE联结)SELECTvend_name,prod_name,prod_priceFROMvendors,productsWHEREvendors.vend_id=product ...

  7. 微信小程序账号注册

    想要开发微信小程序,先注册账号申请APPID. 第一步:百度搜索"微信公众平台" 第二步:立即注册 进入注册页面 区别: 订阅号: 订阅号在文件夹里,订阅号消息 一天只能推送一次, ...

  8. 2021最新Java基础知总结,助力大厂offer

    本文是我花了三周时间整理出来的,希望对Java初学者有帮助~ Java概述 Java的特点 Java是一门面向对象的编程语言.面向对象和面向过程是一种软件开发思想. 面向过程就是分析出解决问题所需要的 ...

  9. jvm源码解读--03 常量池的解析ConstantPool

    先看bt栈 (gdb) bt #0 ConstantPool::allocate (loader_data=0x7fe21802e868, length=87, __the_thread__=0x7f ...

  10. JDK的安装与配置java环境变量

    JDK安装与配置java环境变量 安装JDK 1.百度搜索jdk8找到下载地址 下载地址:Java SE Development Kit 8 - Downloads (oracle.com) 2.点击 ...