题意:给你一张有着n个点的图,图上有m条边,每条边有一个属性[l,r]代表只有size在这个区间范围内的才能通过,你在一开始可以喝下一瓶魔法药水,改变自己的size,问你有多少种可能的size使你能从1号点走到n号点。
思路:对size离散化,线段树节点存储size段,按秩合并幷查集判断是否连通,dfs从线段树根节点遍历所有可能到达的路径。
详细操作:
首先我们将题目给出的m条边的size从小到大离散化,根据[l,r]属性找线段树代表[l,r]区间的对应节点,然后push进去,比如离散化之后我有一条边的属性是[1,4],我就得放到线段树中代表[1,4]的节点中去
如果我们有一条边的属性是[1,3]那么它就得迭代它的l,r,放到对应着区间[1,2],[3,3]的线段树节点里去
所有边都push进线段树节点之后,我们开始从根节点dfs,每次当搜索到叶子节点的时候,我们可以判断1号点是否和n号点在一个集合里边,如果在的话,这个叶子节点所代表的区间段就是可行的size。
显然这种方法是可行的,因为当我们搜索到一个线段树节点的时候,假若这个节点所代表的size是[l,r],如果我们往[1,l-1],[r,max_r]区间搜索,显然是无法形成通路的,因为size段没有形成交集,所以我们每次dfs走到叶子节点所判断的所有可行size必定就是答案全部的可行size。
至于为什么要走到叶子节点再判断是否size段是否可行,因为我们没