几道拓扑排序题的分析
P4316 绿豆蛙的归宿
题意比较简单:走到每一条边的概率是起点的出度分之一,保证图联通无环,求路径总长度的期望。
这是一个简单的图上拓扑 DP。只需要设
由于图是联通且无环的,我们统计总和即可。
CF1131D Gourmet choice
题意就是:给定了
利用拓扑排序解决问题的关键在于找出顶点之间的关系与限制,然后用拓扑排序取得一个可行解。在这个问题中,很明显,限制就是元素之间的大小关系。
但是需要处理相等的情况。很明显,可以用一个并查集将相等的元素合并起来,因为无论怎么样,这些数的最终取值都是相等的。
之后一遍拓扑即可。
CF1635E Cars
我们可以想到:两量方向向外的车,一定无关紧要;同理,两辆命中注定的车,一定共同指向内端。再考虑方向:根据上面的方案,不管两辆车是无关紧要还是命中注定,它们方向都相反。我们可以简单的设
之后我们建图。其实可以用原图来删边,省空间,不过逆向思维不好想。
P3243 [HNOI2015] 菜肴制作
如果没有限制顺序的要求,简简单单拓扑就行了。但是这个限制没有看起来那么简单:要求的是编号小的尽可能往前,但这并不是说字典序尽可能小。考虑
那这怎么处理?把它翻转过来:我们要求小元素尽量靠前,反过来就是小元素尽量靠后,也就是大元素尽量靠前,这实际上就是说字典序最大。那么原来的要求反过来是什么?是说编号大的尽可能往后,是句废话,没法转化。
所以我们要做的就是建反图,用优先队列让大编号点尽可能往前,然后取逆序列。
CF1100E Andrew and Taxi
题意(翻译)极其简洁。既然要 “最大值最小”,很明显二分。于是将最优化转化成可行性判定:是否能通过改变边权小于等于
我们知道:如果不限制边权,那么一定能将一个图转化为无环图。方法如下:我们找到图中入度最小的点,把它的所有入边改成出边,这样就能让它脱环。将它删除后,对剩余图进行同样的操作。
于是我们知道:只要是由边权大于等于
最后的问题就是怎么求方案。实际上也简单。我们对由边权大于等于
总结
拓扑排序有两种题:图上 DP 与求限制方案。对于前者,实际上动态规划转移的过程就是在 DAG 上遍历。点就是状态,而边就是转移。我们设出点代表的状态,然后来找与此相关的边的转移。
对于后者,重要的是找到边的方向以及权值代表的实际意义。这需要我们理解拓扑的原理:起点在拓扑序中,一定在终点之前。通过这个原理,我们就能排出方案。