其他分享
首页 > 其他分享> > 《<图上的游戏>命题报告》学习笔记

《<图上的游戏>命题报告》学习笔记

作者:互联网

《<图上的游戏>命题报告》学习笔记

简要题意

这是一道交互题。

交互器有一个无自环的无向连通图 \(G=(V=\{0,1,\ldots,n-1\},E=\{0,1,\ldots,m-1\})\)。你需要通过如下询问来确定这张图:每次询问你可以给出 \(S\subset E,u\in V\),交互器会返回在 \(G'=(V,E\setminus S)\) 中 \(0\) 和 \(u\) 是否联通。保证交互器不自适应。

\(1\leq n,m\leq 600\),询问次数上线为 \(3000\)。

题解

前置算法

对于一个大小为 \(n\) 的集合\(S\),其中有 \(m\) 个好元素。若每次可以选定 \(T\subset S\),询问 \(T\) 中是否有好元素。那么可以通过对 \(S\) 分治,在 \(O(m\log n)\) 次询问内找到所有好元素。

链的做法

按照随机顺序加入所有点,维护已加入点的相对顺序以及两两相邻点之间的边集。加入一个点时可以二分找到它的位置,然后暴力判断它插入的区间中的所有边在它的哪一侧。期望询问次数为 \(O(n\log n)\)。

树的做法

不妨设该树以 \(0\) 为根。

考虑将树拆成若干条链。具体地,给每个非根结点一个颜色,使所有同色的点组成了树上的一条链。且满足每条链顶端的父亲所在的链的颜色比它小。设一条边的颜色为其较深的端点的颜色。

初始时所有点和边均无颜色。考虑依次加入所有点,维护已确定的所有边的颜色。不妨设此时加入的节点为 \(u\):

拆分成链后,链内部的边可以通过链的做法求出,于是只用求出每条链顶端的父亲。

考虑按照颜色从小到大确定所有链,每次可以通过二分 dfs 序来求出链顶的父亲(保留两个端点 dfs 序均 \(\leq mid\) 的边,判断链顶和根是否连通),然后更新该链的 dfs 序。

询问次数 \(O(n\log n)\)。

图的做法

考虑先找出一棵生成树。

考虑依次加入所有点,维护连通已加入点的生成树。加入节点 \(u\) 时,进行如下操作直到仅保留树边后 \(u\) 能与根连通:

确定了生成树之后树边可以通过树的做法求出,于是只用确定非树边。

考虑按 dfs 序倒序每次确定一个节点,然后将连向该点所有的边删除。不妨设此时的待确定节点为 \(u\)(不难发现此时 \(u\) 一定为叶子),可以通过前置算法求出连向 \(u\) 的所有非树边集合(一个非树边集 \(S\) 包含连向 \(u\) 的边,当且仅当保留 \(S\) 和除了 \(u\) 连向父亲的边之外的所有树边后 \(u\) 和根可以连通)。然后可以通过二分 dfs 序来确定每条边的另一个端点。

询问次数 \(O(n\log n)\)。

code

https://loj.ac/s/1147160

标签:连通,颜色,询问,所有,命题,笔记,学习,确定,dfs
来源: https://www.cnblogs.com/Y25t/p/15344530.html