「NOIP2017」逛公园
传送门
Luogu
解题思路
考虑 \(\text{DP}\)。
设 \(f[u][k]\) 表示从 \(u\) 到 \(n\) 走过不超过 \(Mindis(u, n) + k\) 距离的方案数。
转移方程为:\(f[u][k] = \sum{f[v][k + Mindis(u,n) - Mindis(v,n) - dis(u,v)]}\)
\(Mindis\) 可以预处理。
无解的情况直接在记搜的时候把 \(-1\) 传上去。
最后输出 \(f[1][k]\) 即可。
细节注意事项
- 要记得有多组数据,每次都要初始化
参考代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#include <queue>
#define rg register
using namespace std;
template < typename T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while (!isdigit(c)) f |= (c == '-'), c = getchar();
while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
s = f ? -s : s;
}
const int _ = 100010;
const int __ = 400010;
int n, m, kk, p;
int tot, head1[_], headn[_], nxt[__], ver[__], w[__];
inline void Add_edge(int u, int v, int d, int* head)
{ nxt[++tot] = head[u], head[u] = tot, ver[tot] = v, w[tot] = d; }
struct node{ int val, u; };
inline bool operator < (const node& x, const node& y) { return x.val > y.val; }
int dis[_], vis[_];
priority_queue < node > q;
inline void dijkstra() {
memset(vis, 0, sizeof vis);
memset(dis, 0x3f, sizeof dis);
dis[n] = 0, q.push((node) { 0, n });
while (!q.empty()) {
int u = q.top().u; q.pop();
if (vis[u]) continue; vis[u] = 1;
for (rg int i = headn[u]; i; i = nxt[i]) {
int v = ver[i];
if (dis[v] > dis[u] + w[i])
dis[v] = dis[u] + w[i], q.push((node) { dis[v], v });
}
}
}
int st[_][55], f[_][55];
inline int dfs(int u, int k) {
if (st[u][k]) return -1;
if (f[u][k]) return f[u][k];
st[u][k] = 1;
if (u == n) f[u][k] = 1;
for (rg int i = head1[u]; i; i = nxt[i]) {
int v = ver[i], tmp = dis[v] + w[i] - dis[u];
if (tmp <= k) {
int res = dfs(v, k - tmp);
if (res != -1) f[u][k] = (f[u][k] + res) % p;
else return f[u][k] = -1;
}
}
return st[u][k] = 0, f[u][k];
}
int main() {
#ifndef ONLINE_JUDGE
freopen("in.in", "r", stdin);
#endif
int T; read(T);
while (T--) {
read(n), read(m), read(kk), read(p);
tot = 0;
memset(head1, 0, sizeof head1);
memset(headn, 0, sizeof headn);
for (rg int u, v, d, i = 1; i <= m; ++i)
read(u), read(v), read(d), Add_edge(u, v, d, head1), Add_edge(v, u, d, headn);
dijkstra();
memset(f, 0, sizeof f);
memset(st, 0, sizeof st);
printf("%d\n", dfs(1, kk));
}
return 0;
}
完结撒花 \(qwq\)
「NOIP2017」逛公园的更多相关文章
- LOJ2316. 「NOIP2017」逛公园【DP】【最短路】【思维】
LINK 思路 因为我想到的根本不是网上的普遍做法 所以常数出奇的大,而且做法极其暴力 可以形容是带优化的大模拟 进入正题: 首先一个很显然的思路是如果在合法的路径网络里面存在零环是有无数组解的 然后 ...
- 【LOJ2316】「NOIP2017」逛公园
[题目链接] [点击打开链接] [题目概括] 对给定\(K\),起点\(1\)到终点\(n\)中对长度为\([L,L+K]\)的路径计数. \(L\)为\(1\)到\(n\)的最短路长度. [思路要点 ...
- [luogu P3953] [noip2017 d1t3] 逛公园
[luogu P3953] [noip2017 d1t3] 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N ...
- 「WC2013」糖果公园
「WC2013」糖果公园 传送门 树上带修莫队板子题. 看懂题意后就是板子题了. 参考代码: #include <algorithm> #include <cstdio> #i ...
- 「NOIP2017」宝藏
「NOIP2017」宝藏 题解 博客阅读效果更佳 又到了一年一度NOIPCSP-S 赛前复习做真题的时间 于是就遇上了这道题 首先观察数据范围 \(1 \le n \le 12\) ,那么极大可能性是 ...
- 逛公园「NOIP2017」最短路+DP
大家好我叫蒟蒻,这是我的第一篇信竞题解blog [题目描述] 策策同学特别喜欢逛公园. 公园可以看成一张 \(N\) 个点 \(M\) 条边构成的有向图,且没有自环和重边.其中 \(1\) 号点是公园 ...
- 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索
题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...
- 【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)
题意: 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花 ...
- NOIP2017:逛公园
Sol 发现\(NOIP2017\)还没\(AK\)??? 赶紧改 考场上明明打出了\(DP\),没时间了,没判环,重点是没初始化数组,爆\(0\) \(TAT\) 先最短路,然后\(f[i][j]\ ...
随机推荐
- VS Code的git配置
最近打算使用VS Code作为python的编辑器,这里记录一下VS Code中git的配置方法 因为vscode中git只是使用本地的git,所以本地必须先安装git才行. 1.git的安装 git ...
- vue中,实现锚点定位及跳转(url不发生变化)
<div class="footer" @click="returnTop"> methods:{ returnTop:function(){ do ...
- Ubuntu 安装 uWSGI
uWSGI官方网址: https://pypi.org/project/uWSGI/ 使用如下命令安装: pip install uWSGI 报如下错: Collecting uWSGI Using ...
- 虚拟机中安装centos7后无法上网,使用桥接网络+ssh
首先是桥接网络解决无法上网的问题: 1保证你Vmware里面的虚拟机是关机状态2右键点击电脑屏幕右下角小电脑图标,选择打开网络与共享中心,然后点击弹出来的窗口左上角的“更改适配器设置”.这里指的是你W ...
- SQLite3约束介绍
SQLite 约束 约束是在表的数据列上强制执行的规则.这些是用来限制可以插入到表中的数据类型.这确保了数据库中数据的准确性和可靠性. 约束可以是列级或表级.列级约束仅适用于列,表级约束被应用到整个表 ...
- ubuntu 命令记录
1.su root 进入root模式 2.ifconfig 查看ip地址 3.ls 查看文件 4./etc/init.d/matrix-gui-2.0 stop 关闭matrix界面 5.cd /文 ...
- 使用$.ajax时的注意事项
做PHP难免接触js,我也是这样,使用ajax的时候,我比较习惯使用$.ajax({}),这种方式,因为通用性较强.有时候会较少使用js,隔一段时间后再使用,有些细节内容容易模糊不清,这一次,我又忘记 ...
- Python爬虫:requests模块的基本使用
官方文档:https://requests.readthedocs.io/zh_CN/latest/ 基本使用 基本结构 发送请求,获取响应:r = requests.get(url) 爬取网页的通用 ...
- DHCP报文交互流程
1.发现阶段,即DHCP客户机寻找DHCP服务器的阶段(DHCPdiscover) DHCP客户机以广播方式(因为DHCP服务器的IP地址对于客户机来说是未知的)发送DHCPdiscover发现信息来 ...
- zigbee学习基础
应用场合:功耗(休眠)以及自组网(动态路由,梯度法寻径)是其特点.距离短.功耗低且传输速率不高的各种电子设备之间进行有周期性数据.间歇性数据和低反应时间数据传输的应用(智能家居/仓储中转/伞兵落地协同 ...