题目描述
给定一张初始没有边的无向图,节点编号为 1 到 n。图支持两种操作:
- 连接操作:格式为
1 u v,表示在节点 u 和节点 v 之间添加一条边(若该边已存在,则忽略)。
- 查询操作:格式为
2 u k,询问节点 u 的所有直接相邻节点中,编号第 k 大的节点是多少(相邻节点按节点编号升序排列,则第 k 大即为倒数第 k 个)。若 u 的相邻节点不足 k 个,则输出 -1。
思路分析
本题要求在动态添加边的无向图中,实现高效的邻居查询操作。由于每个查询只关心第 k 大的邻居且 k 最大为 10,我们可以为每个节点维护一个大小不超过 10的有序列表,记录其编号最大的邻居。在添加边时,先通过集合判断是否重复,然后更新该节点的局部最大邻居列表;查询时直接从有序列表中获取答案。这样既能确保添加边和查询操作的时间复杂度低,又能满足题目要求。
P2664.第2题-图的边连接与查询
题目内容
给定一张初始没有边的无向图,图的节点编号为1到n。你可以进行两种操作:
连接操作:
- 连接两个节点u和v,表示在它们之间添加一条边。
- 查询操作:询问节点u直接相连的点中,编号第k大的相邻节点是什么。若直接相邻的点不足k个,则返回−1。
输入描述
第一行包含两个整数n和q,分别表示节点的数量和操作的数量(1≤n≤105,1≤q≤105)。
接下来的q行中,每行包含一个操作:
对于连接操作,格式为1 u v,其中1≤u,v≤n,如果原本两点之间有边,则忽略这次操作。
对于查询操作,格式为2 u k,其中1≤u≤n,1≤k≤10。
输出描述
对于每个查询操作,输出一行结果,表示编号第k大的边的目标节点。如果不存在这样的边,则输出−1。
样例1
输入
5 8
1 1 2
1 1 3
1 2 3
2 1 1
2 1 2
1 2 4
2 2 1
2 2 7
输出
3
2
4
-1
说明
- 操作1:
112连接节点1和2。
- 操作2:
113连接节点1和3。
`
- 操作3:
123 连接节点2和 3。
- 操作4:
211查询节点1直接相连的相邻节点中,编号第1大的是3(相连节点为2,3,按编号排序)。
- 操作5
:212查询节点1直接相连的相邻节点中,编号第2大的是2(相连节点为2,3)。
- 操作6:
124 连接节点2和4。
- 操作7:
221查询节点2直接相连的相邻节点中,编号第1大的是4(相连节点为1,3,4)。
- 操作8:
227查询节点2直接相连的相邻节点中,编号第7大的是−1(只存在3个相邻节点)。