博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu5420 Victor and Proposition
阅读量:6279 次
发布时间:2019-06-22

本文共 699 字,大约阅读时间需要 2 分钟。

官方题解:

这是一道图论题。其中,命题与命题之间的关系我们可以看成边,如果A命题是B命题的充分条件,那么我们就可以从A向B连一条有向边,同理,如果B是A的充分条件,那么就从B向A连一条有向边。那么如果两个命题i,j互为充要条件,那么i和j就会属于同一个强连通分量,所以,这道题就变成了求强连通分量的题目。强连通分量有两种求法,分别是Kosaraju算法和Tarjan算法,在这里我就不详细介绍了。这道题的关键实际上在于建图。

首先,题中给出了一个以1号结点为根的树形结构,我们在构图的过程中,要将结点i和以xi为根的子树中与xi深度差不超过di的结点连一条有向边。但是,结点最多有十万个,如果直接连的话肯定是会超时的,所以需要一些黑科技进行优化。我们要用线段树来优化建图。对于每个结点,我们都需要用一棵线段树来维护其子树中深度为i的结点有哪些,那么,连边的时候,我们只需要将结点i往xi的线段树中,dep[x_i]到dep[x_i]+d_i的范围内的所有结点连一条边即可,既然已经建了线段树,如果线段树上每个结点往其子节点都连一条边,那么我们只要将结点i与对应线段树中[dep[x_i],dep[x_i]+d_i]范围内的结点连一条边。但是这样一来,建图的速度反而变慢了,没有关系,我们可以进行线段树合并。首先,遍历整个树,对于树上的叶子结点,我们都建立一棵线段树,之后,在返回的过程中,每个结点对应的线段树都是其所有子结点线段树合并的结果,这样一来,建图的复杂度就变成O(nlogn)了。

 

 

转载于:https://www.cnblogs.com/astoninfer/p/4791179.html

你可能感兴趣的文章
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>
PHP高级编程之守护进程,实现优雅重启
查看>>
PHP字符编码转换类3
查看>>
rsync同步服务配置手记
查看>>
http缓存知识
查看>>
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>
关于redis的几件小事(六)redis的持久化
查看>>