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

记忆化搜索(dfs+memo)无环有向图

这是一道可以当作板子的极简记忆化搜索 

 

建立a 是邻接表,其中 a[x] 存储从节点 x 出发能到达的所有节点。

b[x] 记录从节点 x 出发的所有边的权重之和。根据数学原理,我们很容易发现,一个根(起点)的期望,等于他所有子的期望加上边权和,除边

 

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, m, x, y, z;
vector<vector<int>> a(N); //邻接表
double b[N]; //记录从节点 x 出发的所有边的权重之和。

double dfs(int x) {
    if (x == n) return 0.0; //到达终点,期望为0

    double o = 0.0;
    int p = a[x].size();
    for (auto i : a[x]) {//所有子的期望和
        o += dfs(i);
    }
    o += b[x];//加上边权和
    return o / p;//期望
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        cin >> x >> y >> z;
        a[x].push_back(y);
        b[x] += z;
    }
    double o = dfs(1);
    printf("%.2lf\n", o); 
    return 0;
}

这样写出来,思路是对的,但是在多条路径下,我们明显可以发现,每个子节点都会计算很多次,所以我们使用记忆化来优化;

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n, m, x, y, z;
vector<vector<int>> a(N); 
double b[N]; 
double memo[N];  //储存
bool vis[N]; //判断是否被计算过

double dfs(int x) {
    if (vis[x]) return memo[x];//如果计算了,直接返回结果
    if (x == n) return 0.0; 
    vis[x] = true;
    double o = 0.0;
    int p = a[x].size();
    for (auto i : a[x]) {
        o += dfs(i);
    }
    if (p == 0) return 0.0;  
    o += b[x];
    return memo[x]=o / p;//返回时给memo记录
}

int main() {
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        cin >> x >> y >> z;
        a[x].push_back(y);
        b[x] += z;
    }
    memset(vis, false, sizeof(vis));//初始化
    double o = dfs(1);
    printf("%.2lf\n", o); 
    return 0;
}

http://www.lqws.cn/news/549109.html

相关文章:

  • ubuntu22上安装redis6
  • 【开发杂谈】Auto Caption:使用 Electron 和 Python 开发实时字幕显示软件
  • JAX study notes[7]
  • uniapp消息推送
  • Springboot中常用的注解(分层整理)
  • Redis主从复制原理
  • CI/CD的常规设置及核心原理
  • 【大数据】大数据产品基础篇
  • OpenCV图像添加水印
  • Java底层原理:深入理解JVM类加载机制与反射机制
  • nginx:配置反向代理后不生效
  • 智能实验室革命:Deepoc大模型驱动全自动化科研新生态
  • could not import google.golang.org/protobuf/proto
  • 前沿融合:机器学习如何重塑智能水泥基复合材料研发范式
  • 学习设计模式《十五》——模板方法模式
  • 多张图片生成PDF每张图片生成pdf的一页
  • Windows Server 2019 查询远程登录源 IP 地址(含 RDP 和网络登录)
  • 论云原生架构及应用
  • AcWing--数据结构(二)
  • clion配置旧的C项目为CMake项目工程
  • 生成树基础实验
  • 【C++】atoi和std::stoi
  • 本年度TOP5服装收银系统对比推荐
  • HTTPS hostname wrong: should be <xxx>错误解决
  • .小故事.
  • 基于DeepSeek搭建Dify智能助手国产化架构运行arm64
  • 【LeetCode】滑动窗口相关算法题
  • leetcode.2014 重复k次的最长子序列
  • Deformable Transformer 详解
  • 本地缓存Caffeine详解(含与Spring Cache集成)