【题目链接】

【题目概括】

对给定\(K\),起点\(1\)到终点\(n\)中对长度为\([L,L+K]\)的路径计数。

\(L\)为\(1\)到\(n\)的最短路长度。

【思路要点】

  • 考虑\(DP\),定义\(dp[i][j]\)表示从\(i\)点到终点\(n\)的距离比原来的最短距离长了\(j\)的方案数。
  • 那么考虑转移,\(dp[u][j]=\sum dp[v][j-g]\),其中\(g=dis[v]+w(i,j)-dis[u]\)。

【代码】

  1. #include <bits/stdc++.h>
  2. #define inf 0x3f3f3f3f
  3. using namespace std;
  4. const int N = 2e5 + 5;
  5. struct _edge {
  6. int to, nt, w;
  7. } E1[N], E2[N];
  8. int H1[N], H2[N], dis[N];
  9. int edgeCnt1, edgeCnt2;
  10. bool vis[N];
  11. bool ban[N][55];
  12. int dp[N][55];
  13. int n, m, k, MOD;
  14. void addEdge1(int u, int v, int w) {
  15. E1[++edgeCnt1] = (_edge){v, H1[u], w};
  16. H1[u] = edgeCnt1;
  17. }
  18. void addEdge2(int u, int v, int w) {
  19. E2[++edgeCnt2] = (_edge){v, H2[u], w};
  20. H2[u] = edgeCnt2;
  21. }
  22. void init() {
  23. edgeCnt1 = edgeCnt2 = 0;
  24. for (int i = 1; i <= n; i++)
  25. H1[i] = H2[i] = 0;
  26. for (int i = 1; i <= n; i++)
  27. for (int j = 0; j <= k; j++)
  28. dp[i][j] = -1, ban[i][j] = 0;
  29. }
  30. void spfa(int s) {
  31. for (int i = 1; i <= n; i++)
  32. dis[i] = inf, vis[i] = 0;
  33. queue<int> q;
  34. q.push(s);
  35. vis[s] = 1;
  36. dis[s] = 0;
  37. while (!q.empty()) {
  38. int u = q.front();
  39. q.pop();
  40. vis[u] = 0;
  41. for (int e = H2[u]; e; e = E2[e].nt) {
  42. int v = E2[e].to;
  43. if (dis[v] > dis[u] + E2[e].w) {
  44. dis[v] = dis[u] + E2[e].w;
  45. if (!vis[v]) {
  46. q.push(v);
  47. vis[v] = 1;
  48. }
  49. }
  50. }
  51. }
  52. }
  53. int dfs(int u, int k) {
  54. if (k < 0)
  55. return 0;
  56. else if (ban[u][k])
  57. return -1;
  58. else if (dp[u][k] != -1)
  59. return dp[u][k];
  60. ban[u][k] = 1;
  61. dp[u][k] = 0;
  62. if (u == n)
  63. dp[u][k]++;
  64. for (int e = H1[u]; e; e = E1[e].nt) {
  65. int v = E1[e].to;
  66. if (dis[v] == inf)
  67. continue;
  68. int g = dis[v] + E1[e].w - dis[u];
  69. int res = dfs(v, k - g);
  70. if (res == -1)
  71. return -1;
  72. dp[u][k] = (dp[u][k] + res) % MOD;
  73. }
  74. ban[u][k] = 0;
  75. return dp[u][k];
  76. }
  77. int main() {
  78. int T; scanf("%d", &T);
  79. while (T--) {
  80. scanf("%d %d %d %d", &n, &m, &k, &MOD);
  81. init();
  82. for (int i = 1; i <= m; i++) {
  83. int u, v, w; scanf("%d %d %d", &u, &v, &w);
  84. addEdge1(u, v, w), addEdge2(v, u, w);
  85. }
  86. spfa(n);
  87. int ans = dfs(1, k);
  88. printf("%d\n", ans);
  89. }
  90. return 0;
  91. }

【LOJ2316】「NOIP2017」逛公园的更多相关文章

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

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

  2. 「NOIP2017」逛公园

    传送门 Luogu 解题思路 考虑 \(\text{DP}\). 设 \(f[u][k]\) 表示从 \(u\) 到 \(n\) 走过不超过 \(Mindis(u, n) + k\) 距离的方案数. ...

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

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

  4. 「WC2013」糖果公园

    「WC2013」糖果公园 传送门 树上带修莫队板子题. 看懂题意后就是板子题了. 参考代码: #include <algorithm> #include <cstdio> #i ...

  5. 「NOIP2017」宝藏

    「NOIP2017」宝藏 题解 博客阅读效果更佳 又到了一年一度NOIPCSP-S 赛前复习做真题的时间 于是就遇上了这道题 首先观察数据范围 \(1 \le n \le 12\) ,那么极大可能性是 ...

  6. 逛公园「NOIP2017」最短路+DP

    大家好我叫蒟蒻,这是我的第一篇信竞题解blog [题目描述] 策策同学特别喜欢逛公园. 公园可以看成一张 \(N\) 个点 \(M\) 条边构成的有向图,且没有自环和重边.其中 \(1\) 号点是公园 ...

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

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

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

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

  9. NOIP2017:逛公园

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

随机推荐

  1. Ubuntu19.04系统SSH连接CentOS7虚拟机

    一.为CentOS7配置静态IP 注意查看宿主机(Ubuntu19.04)所在局域网段,当前为172.18.25.108 修改当前系统下virtual box的网络设置 [控制]-->[设置]- ...

  2. AcWing池塘计数

    这个题让我们求连通块得数数量,我考虑用flood fill算法. 也就是枚举这个地图每一个点,假如符合要求就bfs与这个点联通的点,并打上标记.结束后接着枚举没有被标记并且符号要求的点... 1.== ...

  3. 小白学习django第四站-关联数据库

    使用mysql连接django首先要配置好相关环境 首先在setting.py配置数据库信息(需要现在mysql中创建一个数据库) 在setting.py那个目录的__init__.py文件中写入 之 ...

  4. Hadoop单机模式/伪分布式模式/完全分布式模式

    一.Hadoop的三种运行模式(启动模式) 一.单机(非分布式)模式 这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统. 默认情况下,Hadoop即处于该模式,用于开发 ...

  5. ubuntu 16.04下ssh访问提示错误

    liuyan@ubuntu:/etc/init.d$ sudo apt-get install openssh-server -yReading package lists... DoneBuildi ...

  6. java实现spark常用算子之count

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  7. js中new到底做了什么?如何重写new?

    new 构造函数()执行顺序1.在堆中开辟对象内存空间, 记为obj2.在obj 中添加__proto__属性并指向 构造函数.prototype3.将构造函数中的this 指向obj4.执行构造函数 ...

  8. angular装饰器

    @NgModule 元数据 NgModule 是一个带有 @NgModule() 装饰器的类.@NgModule() 装饰器是一个函数,它接受一个元数据对象,该对象的属性用来描述这个模块.其中最重要的 ...

  9. 免费安装正版Xshell6+Xftp6

    先进入链接获取最新的下载地址 下载地址 填写一下姓名+邮箱,勾选需要哪个就行了 它会发给你指定邮箱一个地址,点击即可下载 安装就不用说了...

  10. openstack mitaka开启三层网络vxlan

    在这之前,先把之前基于flat模式创建的虚机,全部删除 控制节点: 配置 修改/etc/neutron/neutron.conf的[DEFAULT]区域 将 core_plugin = ml2 ser ...