当前位置: 首页 > article >正文

[NOIP2017 提高组] 逛公园 (题解)

Step 1(30pts).

最短路计数,可以参考 [NOI2007] 社交网络。

Step 2(70pts)

考虑图中没有 0 0 0 边的情况,此时是必然有解的。用 d ( u ) d(u) d(u) 表示从 1 1 1 u u u 的最短路径长度,那么要求的答案就是从 1 1 1 n n n 的长度不超过 d ( n ) + K d(n)+K d(n)+K 的路径。这个问题可以用 DP 求解,设 f ( u ; k ) f(u;k) f(u;k) 表示从 1 1 1 u u u 的长度为 d ( u ) + k d(u)+k d(u)+k 的路径数,则转移如下
f ( u ; k ) = ∑ ( v , u , w ) ∈ E f ( v ; k − w + ( d ( u ) − d ( v ) ) ) f(u;k) = \sum_{(v,u,w)\in E} f(v;k-w+(d(u)-d(v))) f(u;k)=(v,u,w)Ef(v;kw+(d(u)d(v)))
至于按照什么顺序转移,无需考虑太多,直接记忆化搜索即可

int dfs(int u, int k) {
    if (k < 0) return 0;
    if (f[u][k] != 0) return f[u][k];
    int ret = 0;
    // G1 是反向图
    for (auto it = G1[u].begin(); it != G1[u].end(); ++it) {
        int v = it->v, w = it->w;
        ret = (ret + dfs(v, d[u] - d[v] + k - w)) % P;
    }
    return f[u][k] = ret;
}

Step 3(100pts).

现在考虑如何处理有 0 0 0 边的情况,如果直接从图上考虑是否存在 0 0 0 环,将产生十分复杂的讨论(因为有 0 0 0 环不一定会造成无穷多的解)。更合理的一种方式是直接在记忆化搜索时记录当前的搜索路径,由于 DP 的正确性的前提是所有的状态能构成一个 DAG,而如果记忆话搜索的路径出现了环,就说明有无穷多个解

int dfs(int u, int k) {
    if (k < 0) return 0;
    if (inPath[u][k]){
        flag = true; // flag 判断是否有无穷多个解
        return 0;
    }
    if (f[u][k] != 0) return f[u][k];
    inPath[u][k] = true;
    int ret = 0;
    // G1 是反向图
    for (auto it = G1[u].begin(); it != G1[u].end(); ++it) {
        int v = it->v, w = it->w;
        ret = (ret + dfs(v, d[u] - d[v] + k - w)) % P;
        if (flag) return 0;
    }
    inPath[u][k] = false;
    return f[u][k] = ret;
}


http://www.kler.cn/news/10180.html

相关文章:

  • macosBrew
  • 华纳云:php怎么判断域名跳转
  • SpringSecurity中用户表单登录验证源码分析
  • jQuery位置方法
  • 【Cesium 编程第一篇】概述、环境搭建、界面介绍
  • 总结815
  • Android Textview Button 等基础组件学习
  • Java-红黑树的实现
  • Python 小型项目大全 76~81
  • 【数据结构】二叉树的概念及结构
  • 在线文章生成器-文章生成器在线生成
  • 文件小注意
  • 摩兽Pesgo plus首发爆卖,全网关注度破亿!中国潮玩跨骑电自浪潮已至?
  • 家装产业的数字化,正在成为越来越多人的新共识
  • 使用java实现斗地主小游戏
  • MATLAB 不同格式点云文件的读取与显示(1)
  • RCIE练习题2之BGP4+配置
  • 《Java设计模式学习》适配器模式
  • STL基础知识
  • 推荐几款程序员提升工作效率的必备工具
  • 【ChatGPT】预训练模型微调及其应用(ChatGLM-6B、duckduckgo_search、GPT在科研的应用等)
  • 23年5月高项学习笔记10 —— 采购管理
  • 双交叉注意学习用于细粒度视觉分类和目标重新识别
  • 重磅!阿里版本【ChatGPT】开放测评!
  • Thinkphp6.0服务系统
  • argparse参数总结(方便之后自己看)
  • 模板学堂|DataEase图表样式解析
  • 科技成果评价最新攻略,你确定不来看看?
  • Python实现Imagenet数据集的合并和拆分
  • 一篇文章让你搞懂TypeScript中的??和?:和?.和!.是什么意思