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】逛公园的更多相关文章

  1. [luogu P3953] [noip2017 d1t3] 逛公园

    [luogu P3953] [noip2017 d1t3] 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N ...

  2. NOIP2017 D1T3逛公园

    DP+最短路 两遍最短路判零环 DP转移f[i][j] 到点i的距离比最短路多j时的方案数 #include<bits/stdc++.h> using namespace std; ; s ...

  3. NOIP2017 D1T3 逛公园

    发现 \(K\) 很小,不妨设置一个 \(O(NK)\) 的 \(DP\). 发现可行的最短路必须满足是 \(d <= dis <= d + K\). 由逆向思维,则是从某点出发,可以消耗 ...

  4. 【NOIP2017】逛公园 拆点最短路+拓扑(记忆化搜索

    题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间. 策 ...

  5. 【NOIP2017】逛公园(最短路图,拓扑排序,计数DP)

    题意: 策策同学特别喜欢逛公园. 公园可以看成一张 N 个点 M 条边构成的有向图,且没有自环和重边.其中 1 号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值,代表策策经过这条边所要花 ...

  6. NOIP2017:逛公园

    Sol 发现\(NOIP2017\)还没\(AK\)??? 赶紧改 考场上明明打出了\(DP\),没时间了,没判环,重点是没初始化数组,爆\(0\) \(TAT\) 先最短路,然后\(f[i][j]\ ...

  7. 【NOIP2017】逛公园 最短路+DP

    诶,去年场上不会处理$0$的环,只拿了$60$有点可惜. 我们先不管边边权为$0$的边. 我们先跑一次最短路,令$dis[u]$表示从$1$至$u$的最短路的长度. 那么根据题目的要求,从起点走到$u ...

  8. LOJ2316. 「NOIP2017」逛公园【DP】【最短路】【思维】

    LINK 思路 因为我想到的根本不是网上的普遍做法 所以常数出奇的大,而且做法极其暴力 可以形容是带优化的大模拟 进入正题: 首先一个很显然的思路是如果在合法的路径网络里面存在零环是有无数组解的 然后 ...

  9. 【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 ...

  10. 【LOJ2316】「NOIP2017」逛公园

    [题目链接] [点击打开链接] [题目概括] 对给定\(K\),起点\(1\)到终点\(n\)中对长度为\([L,L+K]\)的路径计数. \(L\)为\(1\)到\(n\)的最短路长度. [思路要点 ...

随机推荐

  1. Servlet—Cookie(显示用户上次访问时间、显示商品浏览历史)

    1 . 什么是会话? 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 1.1 会话过程中要解决的一些问题? 每个用户在使用浏览器 ...

  2. JS的分号可以省掉吗?

    摘要: JavaScript语言从设计之初就是考虑带分号的,使用不带分号的编码规则就要小心点啦. 背景 最近在项目中开始使用新的编码规范,一开始ESLint报一大堆错误,改得我想砸键盘,花了好些时间才 ...

  3. inheritCombination.js

    // 组合继承 // 其基本思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承 function Person(name){ this.name = name; th ...

  4. create pdf file using Spire.Pdf or iTextSharp or PdfSharp

    Spire.Pdf: 注:pdf 显示中文一定要设置相应的中文字体,其他外文类似.否则显示为乱码( 如果繁体的服务器上生成的中文内容PDF文档,在简体操作系统保存或并传给简体系统上查看,会存在乱码问题 ...

  5. 2017-11-20 中文代码示例之Vuejs入门教程(一)问题后续

    "中文编程"知乎专栏原文 第一个issue: Error compiling template if using unicode naming as v-for alias · I ...

  6. (网页)javascript如何用递归写一个简单的树形结构

    转自博客园: 现在有一个数据,需要你渲染出对应的列表出来: var data = [ {"id":1}, {"id":2}, {"id":3 ...

  7. JavaWeb:Listener和Filter

    本文内容: Listener Filter 首发日期:2018-07-15 Listener 监听器Listener负责监听事件的发生.我们能在事件发生后执行一些自定义的操作,这就是监听器的意义. 监 ...

  8. ubuntu18.04突然无法上网解决方法

    sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service ...

  9. MySQL复制ERROR 1794 (HY000): Slave is not configured or failed to initialize properly.

    ERROR 1794 (HY000): Slave is not configured or failed to initialize properly. You must at least set  ...

  10. Centos 下添加开机自启动服务和脚本

    最近刚玩Centos7的系统,跟Centos6还是很多方面有改变的,这里记录一下怎么在Centos7下添加开机自启动脚本和服务的方法. 1.添加开机自启服务 我这里以docker 服务为例,设置如下两 ...