首页 > 其他分享 >有向图 dp

有向图 dp

时间:2023-05-16 19:33:07浏览次数:35  
标签:有向图 min 变换 材料 出边 答案 dp

1.1 什么是有向图 dp

我们遇到的博弈问题,例如【省选联考 2023】过河卒,很多都是转化为有向图博弈,其形如:一些节点为终止节点,状态已经确定;一个点的状态由其出边所到达点的状态确定。

如果是 DAG 上,显然我们可以按照拓扑序让每个点搜索到的时候其所有出边都已经确定了状态。但是题目有时候并不是这么温柔。出现了环的时候题目就变得困难了。

对于一般情况的这种 dp,不弱于解丢番图方程,所以一般来说都有一些 adhoc 的策略在里面,但是也是有迹可循,稍微有那么一点套路的。

拓扑排序可以帮你找到环,并依然可以对能确定的状态找到答案;但如果某个点的答案可以“抛弃环上点”(并不是必须所有出边都确定),那么有可能需要使用 dijkstra 等额外工具。

CF325C. Monsters and Diamonds

【题意】

有 \(n\) 种普通材料和 \(m\) 种变换规则。普通材料编号从 \(1\) 到 \(n\),此外还有一种编号为 \(-1\) 的特殊材料。

每种变换规则均形如,消耗一份普通材料 \(x_i\),获得材料 \(p_{i,1}\dots p_{i,k_i}\) 各一份。

保证对于编号 \(1\dots n\) 的每种材料至少有一个变换规则消耗该材料,保证每种变换规则至少产生一份特殊材料。

对于每种普通材料,你需要求出,若初始时恰有一份该材料,一直进行变换直至无法变换时,最少和最多各可获得多少特殊材料。

输出规则如下:

  1. 若无论如何,变换均无法停止,该行输出 -1 -1
  2. 若你可以停止变换,同时获得无限多的特殊材料,则该行最大值的位置输出 -2
  3. 若不满足以上两点,则你输出的答案对 \(314000000\) 取 \(\min\)。

\(n,m,\sum k_i\le 10^5\)。

【分析】

考虑对每一种变换方式建立虚点,如下图:

image

我们尝试先解决 \(\min, \max\) 其中一个问题。
我们应当选择 \(\min\) 问题,因为如果它的答案只有两种,然后求出来之后可以得到 \(-1\),这样 \(\max\) 问题答案也只剩下两种。

考虑 \(\min\) 问题。令 \(dp_i\) 表示 \(1\) 个 \(i\) 物品能换到最少的 \(-1\) 是几个。要么有值,要么 \(-1\)。其中 \(dp_{-1} = 1\),其实这个点没用。

把 \(1 \sim n\) 叫做左部点,\(n + 1 \sim n + m\) 叫做右部点,那么左部点的答案就是所有出边状态取 \(\min\),如果某一个出边的答案一直没有确定,那么它应当是能够连向自己的,说明它的答案一定比自己的答案大,没有贡献。因此把所有能够算出来的出边进行取 \(\min\) 就是自己的答案,而右部点则是所有出边状态之和,一定要所有出边算出来才能够算出自己的。最后没有赋值到的点就是 \(-1\)。

这样的问题怎么处理?看起来有 \(\min\) 也有 \(\sum\),是个拓扑排序加上 dij。其实它用 dij 可以做。

dij 的思想是当 \(u\) 算出来的时候更新所有 \(u \sim v\) 的值,然后一个一个出队。而其需要 \(dp\) 值较大的点对较小的点没有影响。这题就满足这一个条件,如果将右部点看作是一条边,而不是一个独立点的话会更好理解。

算法就是维护一个 pq,右部点 \(deg = 0\) 的时候加入 pq,左部点只要增广到都入 pq。

什么时候用 dij?dp 方程式写出来是 \(\min\),像最短路它就是最短路。(乐)例如最小斯坦纳树的 \(dp\) 方程式写出来也是最短路。

对于 \(\max\),就好做了,把 \(-1\) 的出边入边都删掉之后,能够走到环上的点就是 \(-2\),否则就可以算出来,这个可以拓扑排序。

标签:有向图,min,变换,材料,出边,答案,dp
From: https://www.cnblogs.com/Zeardoe/p/17406601.html

相关文章

  • Ext.Net-----GridPanel (属性|方法|配置|详细介绍)
    1、Ext.NET----GridPanel 主要配置项: store:表格的数据集 columns:表格列模式的配置数组,可自动创建ColumnModel列模式 autoExpandColumn:自动充满表格未用空间的列,参数为列id,该id不能为0 stripeRows:表格是否隔行换色,默认为false cm、colModel:表格的列模式,渲染表格时必须设置......
  • AT_dp_s 题解
    题目传送门第一道数位\(\text{dp}\),检验一下自己懂没懂。特别感谢\(\text{yinhee}\)大佬,他的讲解令我受益匪浅。题目分析\(dp_{pos,res,lim}\)为当前枚举到从高位往低位数第\(pos\)位,数字和取模后的余数为\(res\)时的方案数,其中\(lim\)可以理解为一个布尔值,\(0\)表......
  • m基于归一化最小和译码算法的LDPC误码率性能仿真,对比不同的迭代次数,量化位宽以及归
    1.算法仿真效果matlab2022a仿真结果如下:      2.算法涉及理论知识概要        LDPC码是麻省理工学院RobertGallager于1963年在博士论文中提出的一种具有稀疏校验矩阵的分组纠错码。几乎适用于所有的信道,因此成为编码界近年来的研究热点。它的性能逼近......
  • m基于归一化最小和译码算法的LDPC误码率性能仿真,对比不同的迭代次数,量化位宽以及归
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要LDPC码是麻省理工学院RobertGallager于1963年在博士论文中提出的一种具有稀疏校验矩阵的分组纠错码。几乎适用于所有的信道,因此成为编码界近年来的研究热点。它的性能逼近香农极限,且描述和实现简单,易于进行理论分......
  • P1433 吃奶酪-状压dp
    P1433吃奶酪-状压dp这是5.15晚自习的题目预习直接上题逝一逝吧放心,是对的代码P1433吃奶酪-洛谷|计算机科学教育新生态(luogu.com.cn)记录详情-洛谷|计算机科学教育新生态(luogu.com.cn)我真喜欢记忆化搜索(嘿嘿嘿)记忆化搜索的话,更容易理解dp[x][zt]设定为走到......
  • UDP通信 广播 组播
    #UDP通信  #server.c#include<stdio.h>#include<string.h>#include<arpa/inet.h>#include<stdlib.h>#include<unistd.h>intmain(){intlfd=socket(AF_INET,SOCK_DGRAM,0);char*ip_buf="192.168.248.1......
  • ASEMI代理ADI亚德诺ADP5054ACPZ-R7供电管理芯片介绍
    编辑-Z本文主要介绍ADP5054ACPZ-R7供电管理芯片的基本特性和应用场景。该芯片支持多路输出,具有高效和可靠性的特点,适用于各种电力系统和工业控制设备。 1、ADP5054ACPZ-R7的基本特性ADP5054ACPZ-R7是一款高度集成的供电管理芯片,具有以下特点: (1)支持6路输出,分别为1.8V、2.5V......
  • 配置wordpress:创建隐私政策页(wordpress 6.2)
    一,wordpress系统中默认的隐私政策页1,页面->所有页面:可以看到默认的隐私政策页面 注意默认的隐私政策页的状态是草稿,并未正式发布,需要发布后才能加链接到菜单等二,如果隐私政策页被误删除也可以重新创建也可以指定使用其他页面,例如:改选其他页面,然后点使用本页按钮......
  • POJ--1163 The Triangle(DP)
    记录10:432023-5-15http://poj.org/problem?id=1163reference:《挑战程序设计竞赛(第2版)》第二章练习题索引p135DescriptionFigure1showsanumbertriangle.Writeaprogramthatcalculatesthehighestsumofnumberspassedonaroutethatstartsatthetopa......
  • ThreadPoolExecutor的使用
    线程池的基类是concurrent.futures模块中的Executor,Executor提供了两个子类,即ThreadPoolExecutor和ProcessPoolExecutor,其中ThreadPoolExecutor用于创建线程池,而ProcessPoolExecutor用于创建进程池。如果使用线程池/进程池来管理并发编程,那么只要将相应的task函数提......