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. HDU6215

    Brute Force Sorting Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Othe ...

  2. meta的日常设置

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Python基础二字符串和变量

    了解一下Python中的字符串和变量,和Java,c还是有点区别的,别的不多说,上今天学习的代码 Python中没有自增自减这一项,在转义字符那一块,\n,\r\n都是表示回车,但是对于不同的操作系统 ...

  4. AWT初步— 事件处理模型

    之前学习的内容只能形成一个用户界面,而用户不能对其有实际的操作,也就是说用户界面没有任何功能.要能够让图形界面接收用户的操作,就必须给各个组件加上事件处理机制.在事件处理的过程中,主要涉及三类对象: ...

  5. js 乘除法小数问题

    因为经常需要js来处理显示,就做下笔记 除法: function accDiv(arg1, arg2) { var t1 = 0, t2 = 0, r1, r2; try { t1 = arg1.to ...

  6. Android学习笔记----ArcGIS在线地图服务(Android API)坐标纠偏

    仅限于如下ArcGIS在线地图服务(高德提供数据): //概述:彩色中文含兴趣点版中国基础地图 //投影:WGS 1984 Web-Mercator //切片格式:MIXED90 //服务类型:基础地 ...

  7. loadrunner 场景设计-设置结果文件保存路径

    场景设计-设置结果文件保存路径 by:授客 QQ:1033553122 Results->Results settings Results Name 结果文件夹名称 Directory 指定结果 ...

  8. MVC与单元测试实践之健身网站(六)-计划的添加与重置

    健身计划需要使用者自己定制,没有现成的内容可供选择.本篇就是关于健身计划的添加与重置功能的一部分. 一 功能描述 a) 关于计划的定制,决定以周期的方式,比如有人会以一周为周期,然后安排每周的1.3. ...

  9. Java新建Web应用与配置Tomcat流程

    1. 新版本IDEA新建Web应用后没有web.xml文件,需要通过下图方式添加 2. IDEA中的web文件夹相当于eclipse里的WebRoot文件夹,在里面新建WEB-INF文件夹,再创建cl ...

  10. selenium获取cookie

    参考地址:https://www.cnblogs.com/lingwang3/p/7750156.html # 获取cookie import time from selenium import we ...