【NOIP2017 D1T3】逛公园
NOIP2017 D1T3 逛公园
题意:给一个有向图,每条边有权值,问从\(1\)到\(N\)的长度不超过最短路长度\(+K\)的路径条数。如果有无数条则输出\(-1\)。
思路:我们首先扔掉\(-1\)的情况,再扔掉\(K>0\)的情况,来考虑最裸的最短路计数。那么我们就可以考虑\(dp(i)\)表示走到\(i\)号节点有多少种路径。那么一个记忆化搜索就可以完成这个操作辣。这玩意能得\(30pts\)。
然后考虑\(K>0\)的情况。那么\(dp\)的维度就不能只是\(1\)维了,需要加上一维\(dp(i,j)\)表示到了\(i\)节点,距离为\(dis_i+j\)的路径条数。然后转移的时候枚举\(v\rightarrow i\),从\(dp(v,dis_i+j-cost_{v,i}-dis_v)\)转移来、用记忆化搜索即可。这玩意能得\(70pts\)。
最后我们考虑有\(-1\)的情况,样例告诉我们:有\(-1\)必定有\(0\)环,但有\(0\)环不一定有\(-1\)。所以我们来找找如何在记忆化搜索中找到\(0\)环。
不特别特别难发现:如果我们现在有一个正在查询的状态\(dp(i,j)\),而我们现在又看到了我们需要查询\(dp(i,j)\),那么我们肯定这边有一个权值和为\(0\)的环。
证明:
我们证如果没有权值和为\(0\)的环,那么不会出现上述情况。
首先如果根本就没有环,那么肯定没有任何问题,根本就不会回到\(i\)这个点。
如果有权值和非\(0\)的环,那么转了一圈会回到\(dp(i,j')(j'<j)\),因为每次我们加上\(dis_i\)减去\(dis_v\)的过程经过一个环全消掉了,不会对\(j\)产生影响;而每次\(+j-cost\),会给\(j\)减去\(\sum cost\),所以\(j\)只会变小。
证毕。
所以这样就可以\(ac\)辣。
NOIP2017 D1T3 逛公园 分析
把这些程序分成以下几种类型:
- ZJ-0164、ZJ-0389、GD-0090:
首先我们跑一遍\(dijkstra\)或者\(spfa\)求出从起点开始的最短路径\(dis_i\),
然后考虑用记忆化搜索转移\(dp\):\(dp(i,j)\)表示到了\(i\)节点,到当前节点的距离是\(dis_i+j\)的路径条数。
然后枚举\(v\rightarrow i\),从\(dp(v,dis_i+j-cost_{v,i}-dis_v)\)转移即可。 - ZJ-0188、ZJ-0542、ZJ-0571:
首先在反向图中从终点跑一遍\(dijkstra\),求每个点到终点的最短距离,记为\(dis_i^0\);
再在原图中跑一遍,求每个点到起点的距离,记为\(dis_i^1\)。
然后我们就可以对所有\(0\)边进行强连通分解,
看是否有一个\(0\)环使得一条经过这个\(0\)环的最短路径的长度小于等于\(dis_n^1+k\)的,
如果有那么肯定有无穷解,否则肯定有有限解。
那么再用记忆化搜索转移\(dp\)即可。\(dp\)状态同上。
(ZJ-0542的做法与之类似,但不完全相同,比如他把所有的节点各拆成\(k\)个来进行\(dp\)、没有直接把无穷解给输出等)
(ZJ-0571的做法也与之相似,但也不完全相同,比如他就在\(dp\)中途判断\(-1\)的情况) - ZJ-0274、ZJ-0221、ZJ-0508、ZJ-0417、GD-0112、GD-0349:
首先在反向图中从终点跑一遍\(dijkstra\),求每个点到终点的最短距离,记为\(dis_i^0\),
然后用它来求出每一个点是否在最短路树中,这个概念就是如果\(i\rightarrow v\)且\(dis_i+cost_{i,v}=dis_v\),那么\(i\rightarrow v\)就在最短路树中。
同时我们还需要记录每一个节点是否能够从\(n\)走到,如果不能那么这个节点也没有必要被存下来,因为它不可能对答案造成任何贡献
然后呢我们可以将每条边\(i\rightarrow v\)的边权改成\(dis_i^0+cost_{i,v}-dis_v^0\),这个记录的是如果我们从\(i\)走到\(v\)把最短路的长度增加了多少,然后再对新图跑\(dijkstra\),记为\(dis_i^1\)用来拓扑排序:但这里的“拓扑”序只是对于最短路树而言的,因为最短路树肯定是一个\(dag\)。拓扑排序完了之后如果没有把所有的有可能有贡献的节点都放进去,那么就肯定有无穷解。
最后考虑\(dp\):\(dp(i,j,k)\)表示到\(i\)节点,到当前节点的距离比最短路多的值是\(j\),走的最后一条路是不是属于最短路树中的,路径条数。那么转移是枚举\(v\rightarrow i\),从\(dp(v,j-cost_{i,v}^{now},v\rightarrow i\)是不是属于最短路树\()\)转移来。
求答案的时候就是枚举最后一个走树边到达的节点\(i\),剩余走最短路,加上\(dp(i,j,0)\)。
其实第三维也是可以不加的,只要你最后求答案的时候只把\(dp(n,i)\)加入答案中即可。(比如ZJ-0221)
(GD-0349虽然进行了拓扑排序,但是根本没有用,只是用来判断无穷解,\(dp\)的时候还是用的记忆化)
【NOIP2017 D1T3】逛公园的更多相关文章
- [luogu P3953] [noip2017 d1t3] 逛公园
[luogu P3953] [noip2017 d1t3] 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N ...
- NOIP2017 D1T3逛公园
DP+最短路 两遍最短路判零环 DP转移f[i][j] 到点i的距离比最短路多j时的方案数 #include<bits/stdc++.h> using namespace std; ; s ...
- NOIP2017 D1T3 逛公园
发现 \(K\) 很小,不妨设置一个 \(O(NK)\) 的 \(DP\). 发现可行的最短路必须满足是 \(d <= dis <= d + K\). 由逆向思维,则是从某点出发,可以消耗 ...
- 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索
题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...
- 【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)
题意: 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花 ...
- NOIP2017:逛公园
Sol 发现\(NOIP2017\)还没\(AK\)??? 赶紧改 考场上明明打出了\(DP\),没时间了,没判环,重点是没初始化数组,爆\(0\) \(TAT\) 先最短路,然后\(f[i][j]\ ...
- 【NOIP2017】逛公园 最短路+DP
诶,去年场上不会处理$0$的环,只拿了$60$有点可惜. 我们先不管边边权为$0$的边. 我们先跑一次最短路,令$dis[u]$表示从$1$至$u$的最短路的长度. 那么根据题目的要求,从起点走到$u ...
- LOJ2316. 「NOIP2017」逛公园【DP】【最短路】【思维】
LINK 思路 因为我想到的根本不是网上的普遍做法 所以常数出奇的大,而且做法极其暴力 可以形容是带优化的大模拟 进入正题: 首先一个很显然的思路是如果在合法的路径网络里面存在零环是有无数组解的 然后 ...
- 【NOIP2017】逛公园 D1 T3
记忆化搜索 跑一次反向的最短路求出MinDis(u,n)MinDis(u,n)MinDis(u,n) f[u][k]f[u][k]f[u][k]表示dis(u,n)<=MinDis(u,n)+d ...
- 【LOJ2316】「NOIP2017」逛公园
[题目链接] [点击打开链接] [题目概括] 对给定\(K\),起点\(1\)到终点\(n\)中对长度为\([L,L+K]\)的路径计数. \(L\)为\(1\)到\(n\)的最短路长度. [思路要点 ...
随机推荐
- iomanip的作用 C++
c++程序里面经常见到下面的头文件 #include <iomanip> 这里面iomanip的作用比较多: 主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,s ...
- Python 多线程、多进程 (三)之 线程进程对比、多进程
Python 多线程.多进程 (一)之 源码执行流程.GIL Python 多线程.多进程 (二)之 多线程.同步.通信 Python 多线程.多进程 (三)之 线程进程对比.多线程 一.多线程与多进 ...
- Python:dictionary
# Python3.4 Eclipse+PyDev 打开Eclipse,找到Help菜单栏,进入Install New Software…选项. # 点击work with:输入框的旁边点击Add…, ...
- Spark 跑 java 示例代码
一.下载示例代码: git clone https://github.com/melphi/spark-examples.git 从示例代码中可以看到 pox中引入了 Spark开发所需要的依赖. 二 ...
- React中使用styled-components的基础使用
今天准备来给大家分享分享React中styled-components的基础使用,仅仅是我个人的一些理解,不一定全对,有错误还请大佬们指出,496838236这是我qq,有想指点我的大佬随时加我qq好 ...
- 【代码笔记】Web-HTML-简介
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- vue-cli脚手架之webpack.test.conf.js
webpack单元测试配置: // This is the webpack config used for unit tests. var utils = require('./utils')//ut ...
- selenium win7+selenium2.0+python环境搭建
win7+selenium2.0+python环境搭建 by:授客 QQ:1033553122 步骤1:下载python 担心最新版的支持不太好,这里我下载的是python 2.7(selenium之 ...
- [20171206]rman与truncate2.txt
[20171206]rman与truncate2.txt --//上午测试发现truncate的表在做rman备份时还要做8个extents的备份.--//不知道自己的猜测是否正确,选择一个使用UNI ...
- 在 Azure Resource Manager 模板中使用托管磁盘
本文介绍使用 Azure Resource Manager 模板预配虚拟机时托管与非托管磁盘之间的差异. 这有助于将现有模板从使用非托管磁盘更新为使用托管磁盘. 我们将使用 101-vm-simple ...