忘记密码?据/a>新用户?据a href="//www.parkandroid.com/account/signup/?signup=true&next=/wiki/disjoint-set-data-structure/" id="problem-signup-link-alternative" class="btn-link ax-click" data-ax-id="clicked_signup_from_generic_modal" data-ax-type="button" data-next="/wiki/disjoint-set-data-structure/">注册据/a>
现有用户?据a href="//www.parkandroid.com/account/login/?next=/wiki/disjoint-set-data-structure/" id="problem-login-link-alternative" class="btn-link ax-click" data-ax-id="clicked_login_from_generic_modal" data-ax-type="button" data-is_modal="true" data-next="/wiki/disjoint-set-data-structure/">登录据/a>
已经有一个帐户?据a href="//www.parkandroid.com/account/login/?next=/wiki/disjoint-set-data-structure/" class="ax-click" data-ax-id="clicked_signup_modal_login" data-ax-type="link">这里登录。据/a>
联盟 - 找到据/strong>,是一种数据结构,它将对象分类为不同的集合,并检查两个对象是否属于同一集合。据/p> 数据结构的最流行使用是检查图形中的一个节点是否可以从另一个节点到达。在里面据a target="_blank" rel="nofollow" href="//www.parkandroid.com/wiki/graphs-intermediate/">Kruskal的算法据/a>避免形成循环。据/p>
数据结构的最流行使用是检查图形中的一个节点是否可以从另一个节点到达。在里面据a target="_blank" rel="nofollow" href="//www.parkandroid.com/wiki/graphs-intermediate/">Kruskal的算法据/a>避免形成循环。据/p>
该数据结构应该支持两个操作:据/p>
找到(x)据/code>:返回设置的一些表示据code>X据/code>属于。据/li> 联盟(x,y)据/code>:合并包含的集合据code>X据/code>和据code>y据/code>。据/li>
联盟(x,y)据/code>:合并包含的集合据code>X据/code>和据code>y据/code>。据/li>
通常,它可以配备一个构造函数,该构造函数将每个对象组织到自己的集合中。据/p>
这是一个非常简单的(但不是所有有效的)方式来实现我们想要的东西。我们保留一个存储有关该对象所在的信息的数组。接口实现如下:据/p>
找到(x)据/code>:返回position处的值据code>X据/code>在数组中。这就是O(1)据/li> 联盟(x,y)据/code>:扫描数组以检查是否有任何值据code>y据/code>。如果是这样,请更新它们据code>X据/code>。这是o(n)。据/li>
联盟(x,y)据/code>:扫描数组以检查是否有任何值据code>y据/code>。如果是这样,请更新它们据code>X据/code>。这是o(n)。据/li>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 21 22 23 25 22 26 22据/pre>
班级据/span>丛白据/span>{据/span>//快速查找据/span>int据/span>*据/span>套据/span>;据/span>int据/span>N据/span>;据/span>民众据/span>:据/span>丛白据/span>(据/span>int据/span>N据/span>){据/span>//设置带有n个元素的Union-mind数据结构据/span>N据/span>=据/span>N据/span>;据/span>套据/span>=据/span>新的据/span>int据/span>[据/span>N据/span>];据/span>为了据/span>(据/span>int据/span>III据/span>=据/span>0.据/span>;据/span>III据/span>据据/span>N据/span>;据/span>III据/span>++据/span>)据/span>套据/span>[据/span>III据/span>]据/span>=据/span>III据/span>;据/span>}据/span>int据/span>找据/span>(据/span>int据/span>X据/span>){据/span>返回据/span>套据/span>[据/span>X据/span>];据/span>}据/span>空白据/span>合并据/span>(据/span>int据/span>X据/span>那据/span>int据/span>y据/span>){据/span>//我们称之为此合并。显然,联盟是CPP中的关键字据/span>int据/span>root_x.据/span>=据/span>找据/span>(据/span>X据/span>);据/span>int据/span>root_y.据/span>=据/span>找据/span>(据/span>y据/span>);据/span>为了据/span>(据/span>int据/span>III据/span>=据/span>0.据/span>;据/span>III据/span>据据/span>N据/span>;据/span>III据/span>++据/span>)据/span>如果据/span>(据/span>套据/span>[据/span>III据/span>]据/span>==.据/span>root_x.据/span>)据/span>套据/span>[据/span>III据/span>]据/span>=据/span>root_y.据/span>;据/span>}据/span>};据/span>
实际上,我们可以做得更好。让我们看看如何。据/p>
这一次,我们仍将使用数组进行存储,但我们会想象它是一个据a href="//www.parkandroid.com/wiki/trees-basic/" class="wiki_link" title="森林GydF4y2Ba" target="_blank">森林据/a>。据/p>
我们将保留一个名为据code>父母据/code>跟踪哪个元素是其父元素。每个集合形成一个由其节点表示的树。据/p>
这是森林的一个例子据code>{1,2,5,6,7}据/code>形成一套和据code>{0,3,4}据/code>形成另一个。据/p>
找到(x)据/code>:递归保留找到父母据code>X据/code>直到遇到是本身的父母的元素。因为这是一棵树,如果工会足够随机,这应该做得更好,但最坏的情况是据span class="katex"> O.据/mi> (据/mo> N据/mi> )据/mo> 在)据/annotation> O.据/span>(据/span>N据/span>)据/span>,如果树很高。据/p>
联盟(x,y)据/code>:找到根源据code>X据/code>并使其指向朝向的根源据code>y据/code>。据/p>
1 2 3 4 5 6 7 8 9 10 11 12 13 13 14 15 16 18 19 20 21 21 22 23 22 22 22 27 22 22 22据/pre>
班级据/span>丛白据/span>{据/span>//快速联合据/span>int据/span>*据/span>父母据/span>;据/span>int据/span>N据/span>;据/span>民众据/span>:据/span>丛白据/span>(据/span>int据/span>N据/span>){据/span>//设置带有n个元素的Union-mind数据结构据/span>N据/span>=据/span>N据/span>;据/span>父母据/span>=据/span>新的据/span>int据/span>[据/span>N据/span>];据/span>为了据/span>(据/span>int据/span>III据/span>=据/span>0.据/span>;据/span>III据/span>据据/span>N据/span>;据/span>III据/span>++据/span>)据/span>套据/span>[据/span>III据/span>]据/span>=据/span>III据/span>;据/span>}据/span>int据/span>找据/span>(据/span>int据/span>X据/span>){据/span>int据/span>根据/span>=据/span>X据/span>;据/span>尽管据/span>(据/span>父母据/span>[据/span>根据/span>]据/span>!=据/span>根据/span>)据/span>根据/span>=据/span>父母据/span>[据/span>根据/span>];据/span>返回据/span>根据/span>;据/span>}据/span>空白据/span>合并据/span>(据/span>int据/span>X据/span>那据/span>int据/span>y据/span>){据/span>int据/span>root_x.据/span>=据/span>找据/span>(据/span>X据/span>);据/span>int据/span>root_y.据/span>=据/span>找据/span>(据/span>y据/span>);据/span>父母据/span>[据/span>root_x.据/span>]据/span>=据/span>root_y.据/span>;据/span>}据/span>};据/span>
上述数据结构的问题是树木可能变得太高。可以通过正确决定哪个树来解决这个问题,这应该是这样的。据/p>
树1据/strong> 树2.据/strong> 将树1放在树2或树下2下面的树1下面是一个更好的想法吗?据/p> 树2的高度为4,而树1的高度为3.如果我们将树2放在树1的根下,我们得到更大的高度树5。但是,在树2的根下放置树1仍然使得高度4。据/p>
树1据/strong>
树2.据/strong>
将树1放在树2或树下2下面的树1下面是一个更好的想法吗?据/p>
树2的高度为4,而树1的高度为3.如果我们将树2放在树1的根下,我们得到更大的高度树5。但是,在树2的根下放置树1仍然使得高度4。据/p>
一般来说,当我们有两棵高度的树木据span class="katex"> m据/mi> m据/annotation> m据/span>和据span class="katex"> N据/mi> N据/annotation> N据/span>这样据span class="katex"> m据/mi> ≤.据/mo> N据/mi> 那据/mo> M \ LEQ N,据/annotation> m据/span>≤.据/span>N据/span>那据/span>我们应该把身高的树据span class="katex"> m据/mi> m据/annotation> m据/span>在下面据span class="katex"> N据/mi> N据/annotation> N据/span>并且仍然得到一个高度的树据span class="katex"> N据/mi> N据/annotation> N据/span>。据/p> 要实现这一点,我们需要保留数组据code>尺寸[i]据/code>这可以跟踪植根树的树木中的物体据code>一世据/code>。据/p> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 21 22 23 32 32 32 32 32 32 32 32 32 32 37 37 37 37 37 37 37 32据/pre> 班级据/span>丛白据/span>{据/span>//快速联合加权据/span>int据/span>*据/span>父母据/span>;据/span>int据/span>*据/span>尺寸据/span>;据/span>int据/span>N据/span>;据/span>民众据/span>:据/span>丛白据/span>(据/span>int据/span>N据/span>){据/span>//设置带有n个元素的Union-mind数据结构据/span>N据/span>=据/span>N据/span>;据/span>父母据/span>=据/span>新的据/span>int据/span>[据/span>N据/span>];据/span>尺寸据/span>=据/span>新的据/span>int据/span>[据/span>N据/span>];据/span>为了据/span>(据/span>int据/span>III据/span>=据/span>0.据/span>;据/span>III据/span>据据/span>N据/span>;据/span>III据/span>++据/span>){据/span>父母据/span>[据/span>III据/span>]据/span>=据/span>III据/span>;据/span>尺寸据/span>[据/span>III据/span>]据/span>=据/span>1据/span>;据/span>}据/span>}据/span>int据/span>找据/span>(据/span>int据/span>X据/span>){据/span>int据/span>根据/span>=据/span>X据/span>;据/span>尽管据/span>(据/span>父母据/span>[据/span>根据/span>]据/span>!=据/span>根据/span>)据/span>根据/span>=据/span>父母据/span>[据/span>根据/span>];据/span>返回据/span>根据/span>;据/span>}据/span>空白据/span>合并据/span>(据/span>int据/span>X据/span>那据/span>int据/span>y据/span>){据/span>int据/span>root_x.据/span>=据/span>找据/span>(据/span>X据/span>);据/span>int据/span>root_y.据/span>=据/span>找据/span>(据/span>y据/span>);据/span>如果据/span>(据/span>尺寸据/span>[据/span>root_y.据/span>]据/span>>据/span>尺寸据/span>[据/span>root_x.据/span>]){据/span>//确保较小的树在较大的树下下据/span>父母据/span>[据/span>root_x.据/span>]据/span>=据/span>root_y.据/span>;据/span>尺寸据/span>[据/span>root_y.据/span>]据/span>+ =据/span>尺寸据/span>[据/span>root_x.据/span>];据/span>}据/span>别的据/span>{据/span>父母据/span>[据/span>root_y.据/span>]据/span>=据/span>root_x.据/span>;据/span>尺寸据/span>[据/span>root_x.据/span>]据/span>+ =据/span>尺寸据/span>[据/span>root_y.据/span>];据/span>}据/span>}据/span>};据/span> 现在,两者据code>找据/code>和据code>联盟据/code>工作据span class="katex"> O.据/mi> (据/mo> 日志据/mi> 据/mo> N据/mi> )据/mo> o(\ log n)据/annotation> O.据/span>(据/span>日志ydF4y2BaG据/span>N据/span>)据/span>。据/p> 当另一个更大或相同高度的树木与它的另一棵树为单位,树的高度在大多数节点上增加。据/p> 由于其他树至少与本身一样大,因此必须具有至少两倍的元素数。据/p> 但只有据span class="katex"> N据/mi> N据/annotation> N据/span>元素,所以加倍可能发生据span class="katex"> 日志据/mi> 据/mo> N据/mi> \ log n.据/annotation> 日志ydF4y2BaG据/span>N据/span>时代。据/p> 因此,树的最大高度是据span class="katex"> O.据/mi> (据/mo> 日志据/mi> 据/mo> N据/mi> )据/mo> 那据/mo> o(\ log n),据/annotation> O.据/span>(据/span>日志ydF4y2BaG据/span>N据/span>)据/span>那据/span>这是我们需要接近根的操作数。据/p>
要实现这一点,我们需要保留数组据code>尺寸[i]据/code>这可以跟踪植根树的树木中的物体据code>一世据/code>。据/p>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 21 22 23 32 32 32 32 32 32 32 32 32 32 37 37 37 37 37 37 37 32据/pre>
班级据/span>丛白据/span>{据/span>//快速联合加权据/span>int据/span>*据/span>父母据/span>;据/span>int据/span>*据/span>尺寸据/span>;据/span>int据/span>N据/span>;据/span>民众据/span>:据/span>丛白据/span>(据/span>int据/span>N据/span>){据/span>//设置带有n个元素的Union-mind数据结构据/span>N据/span>=据/span>N据/span>;据/span>父母据/span>=据/span>新的据/span>int据/span>[据/span>N据/span>];据/span>尺寸据/span>=据/span>新的据/span>int据/span>[据/span>N据/span>];据/span>为了据/span>(据/span>int据/span>III据/span>=据/span>0.据/span>;据/span>III据/span>据据/span>N据/span>;据/span>III据/span>++据/span>){据/span>父母据/span>[据/span>III据/span>]据/span>=据/span>III据/span>;据/span>尺寸据/span>[据/span>III据/span>]据/span>=据/span>1据/span>;据/span>}据/span>}据/span>int据/span>找据/span>(据/span>int据/span>X据/span>){据/span>int据/span>根据/span>=据/span>X据/span>;据/span>尽管据/span>(据/span>父母据/span>[据/span>根据/span>]据/span>!=据/span>根据/span>)据/span>根据/span>=据/span>父母据/span>[据/span>根据/span>];据/span>返回据/span>根据/span>;据/span>}据/span>空白据/span>合并据/span>(据/span>int据/span>X据/span>那据/span>int据/span>y据/span>){据/span>int据/span>root_x.据/span>=据/span>找据/span>(据/span>X据/span>);据/span>int据/span>root_y.据/span>=据/span>找据/span>(据/span>y据/span>);据/span>如果据/span>(据/span>尺寸据/span>[据/span>root_y.据/span>]据/span>>据/span>尺寸据/span>[据/span>root_x.据/span>]){据/span>//确保较小的树在较大的树下下据/span>父母据/span>[据/span>root_x.据/span>]据/span>=据/span>root_y.据/span>;据/span>尺寸据/span>[据/span>root_y.据/span>]据/span>+ =据/span>尺寸据/span>[据/span>root_x.据/span>];据/span>}据/span>别的据/span>{据/span>父母据/span>[据/span>root_y.据/span>]据/span>=据/span>root_x.据/span>;据/span>尺寸据/span>[据/span>root_x.据/span>]据/span>+ =据/span>尺寸据/span>[据/span>root_y.据/span>];据/span>}据/span>}据/span>};据/span>
现在,两者据code>找据/code>和据code>联盟据/code>工作据span class="katex"> O.据/mi> (据/mo> 日志据/mi> 据/mo> N据/mi> )据/mo> o(\ log n)据/annotation> O.据/span>(据/span>日志ydF4y2BaG据/span>N据/span>)据/span>。据/p> 当另一个更大或相同高度的树木与它的另一棵树为单位,树的高度在大多数节点上增加。据/p> 由于其他树至少与本身一样大,因此必须具有至少两倍的元素数。据/p> 但只有据span class="katex"> N据/mi> N据/annotation> N据/span>元素,所以加倍可能发生据span class="katex"> 日志据/mi> 据/mo> N据/mi> \ log n.据/annotation> 日志ydF4y2BaG据/span>N据/span>时代。据/p> 因此,树的最大高度是据span class="katex"> O.据/mi> (据/mo> 日志据/mi> 据/mo> N据/mi> )据/mo> 那据/mo> o(\ log n),据/annotation> O.据/span>(据/span>日志ydF4y2BaG据/span>N据/span>)据/span>那据/span>这是我们需要接近根的操作数。据/p>
当另一个更大或相同高度的树木与它的另一棵树为单位,树的高度在大多数节点上增加。据/p> 由于其他树至少与本身一样大,因此必须具有至少两倍的元素数。据/p> 但只有据span class="katex"> N据/mi> N据/annotation> N据/span>元素,所以加倍可能发生据span class="katex"> 日志据/mi> 据/mo> N据/mi> \ log n.据/annotation> 日志ydF4y2BaG据/span>N据/span>时代。据/p> 因此,树的最大高度是据span class="katex"> O.据/mi> (据/mo> 日志据/mi> 据/mo> N据/mi> )据/mo> 那据/mo> o(\ log n),据/annotation> O.据/span>(据/span>日志ydF4y2BaG据/span>N据/span>)据/span>那据/span>这是我们需要接近根的操作数。据/p>
当另一个更大或相同高度的树木与它的另一棵树为单位,树的高度在大多数节点上增加。据/p>
由于其他树至少与本身一样大,因此必须具有至少两倍的元素数。据/p>
但只有据span class="katex"> N据/mi> N据/annotation> N据/span>元素,所以加倍可能发生据span class="katex"> 日志据/mi> 据/mo> N据/mi> \ log n.据/annotation> 日志ydF4y2BaG据/span>N据/span>时代。据/p>
因此,树的最大高度是据span class="katex"> O.据/mi> (据/mo> 日志据/mi> 据/mo> N据/mi> )据/mo> 那据/mo> o(\ log n),据/annotation> O.据/span>(据/span>日志ydF4y2BaG据/span>N据/span>)据/span>那据/span>这是我们需要接近根的操作数。据/p>
这是另一个想法:我们已经触摸了所有节点据code>X据/code>到根。我们为什么不像我们去的树一样推动树?据/p>
这只需要一行额外的代码据code>找据/code>手术。检查下面的第22行。据/p>
1 2 3 4 5 6 7 8 9 10 11 12 13 13 14 15 16 18 19 20 21 22 21 23 32 32 32 32 32 32 32 32 32 37 37 37 37 37 37 37 37 37 37 32 40 41据/pre>
班级据/span>丛白据/span>{据/span>//快速联盟,加权和路径压缩据/span>int据/span>*据/span>父母据/span>;据/span>int据/span>*据/span>尺寸据/span>;据/span>int据/span>N据/span>;据/span>民众据/span>:据/span>丛白据/span>(据/span>int据/span>N据/span>){据/span>//设置带有n个元素的Union-mind数据结构据/span>N据/span>=据/span>N据/span>;据/span>父母据/span>=据/span>新的据/span>int据/span>[据/span>N据/span>];据/span>尺寸据/span>=据/span>新的据/span>int据/span>[据/span>N据/span>];据/span>为了据/span>(据/span>int据/span>III据/span>=据/span>0.据/span>;据/span>III据/span>据据/span>N据/span>;据/span>III据/span>++据/span>){据/span>父母据/span>[据/span>III据/span>]据/span>=据/span>III据/span>;据/span>尺寸据/span>[据/span>III据/span>]据/span>=据/span>1据/span>;据/span>}据/span>}据/span>int据/span>找据/span>(据/span>int据/span>X据/span>){据/span>int据/span>根据/span>=据/span>X据/span>;据/span>尽管据/span>(据/span>父母据/span>[据/span>根据/span>]据/span>!=据/span>根据/span>){据/span>父母据/span>[据/span>根据/span>]据/span>=据/span>父母据/span>[据/span>父母据/span>[据/span>根据/span>]];据/span>//按一个级别推上节点据/span>根据/span>=据/span>父母据/span>[据/span>根据/span>];据/span>}据/span>返回据/span>根据/span>;据/span>}据/span>空白据/span>合并据/span>(据/span>int据/span>X据/span>那据/span>int据/span>y据/span>){据/span>int据/span>root_x.据/span>=据/span>找据/span>(据/span>X据/span>);据/span>int据/span>root_y.据/span>=据/span>找据/span>(据/span>y据/span>);据/span>如果据/span>(据/span>尺寸据/span>[据/span>root_y.据/span>]据/span>>据/span>尺寸据/span>[据/span>root_x.据/span>]){据/span>//确保较小的树在较大的树下下据/span>父母据/span>[据/span>root_x.据/span>]据/span>=据/span>root_y.据/span>;据/span>尺寸据/span>[据/span>root_y.据/span>]据/span>+ =据/span>尺寸据/span>[据/span>root_x.据/span>];据/span>}据/span>别的据/span>{据/span>父母据/span>[据/span>root_y.据/span>]据/span>=据/span>root_x.据/span>;据/span>尺寸据/span>[据/span>root_x.据/span>]据/span>+ =据/span>尺寸据/span>[据/span>root_y.据/span>];据/span>}据/span>}据/span>};据/span>
这实际上保持树几乎平坦。事实上,这使得运营工作据span class="katex"> O.据/mi> (据/mo> 日志据/mi> 据/mo> *据/mo> N据/mi> )据/mo> o(\ log ^ * n)据/annotation> O.据/span>(据/span>日志ydF4y2BaG据/span>*据/span>N据/span>)据/span>由此证明的时间据a target="_blank" rel="nofollow" href="http://epubs.siam.org/doi/abs/10.1137/0202024">Hopcroft和Ullman.据/a>。据/p> 日志据/mi> 据/mo> *据/mo> N据/mi> \ log ^ * n据/annotation> 日志ydF4y2BaG据/span>*据/span>N据/span>是需要申请的次数据span class="katex"> 日志据/mi> 据/mo> \日志据/annotation> 日志ydF4y2BaG据/span>到据span class="katex"> N据/mi> N据/annotation> N据/span>获得小于或等于的值。在实践中,人们可能会想到它几乎据span class="katex"> O.据/mi> (据/mo> 1据/mn> )据/mo> O(1)据/annotation> O.据/span>(据/span>1据/span>)据/span>由于它才超过5据span class="katex"> 2据/mn> 65536.据/mn> 。据/mi> 2 ^ {65536}。据/annotation> 2据/span>6.据/span>5.据/span>5.据/span>3.据/span>6.据/span>。据/span> 界限后来得到了改善据a target="_blank" rel="nofollow" href="https://dl.acm.org/citation.cfm?id=321884">tarjan.据/a>到据span class="katex"> O.据/mi> (据/mo> α.据/mi> (据/mo> N据/mi> )据/mo> )据/mo> 那据/mo> o \ big(\ alpha(n)\ big),据/annotation> O.据/span>(据/span>α.据/span>(据/span>N据/span>)据/span>)据/span>那据/span>在哪里据span class="katex"> α.据/mi> \α据/annotation> α.据/span>是逆据a target="_blank" rel="nofollow" href="//www.parkandroid.com/problems/ackerman-function/">Ackermann功能据/a>。据/p>
日志据/mi> 据/mo> *据/mo> N据/mi> \ log ^ * n据/annotation> 日志ydF4y2BaG据/span>*据/span>N据/span>是需要申请的次数据span class="katex"> 日志据/mi> 据/mo> \日志据/annotation> 日志ydF4y2BaG据/span>到据span class="katex"> N据/mi> N据/annotation> N据/span>获得小于或等于的值。在实践中,人们可能会想到它几乎据span class="katex"> O.据/mi> (据/mo> 1据/mn> )据/mo> O(1)据/annotation> O.据/span>(据/span>1据/span>)据/span>由于它才超过5据span class="katex"> 2据/mn> 65536.据/mn> 。据/mi> 2 ^ {65536}。据/annotation> 2据/span>6.据/span>5.据/span>5.据/span>3.据/span>6.据/span>。据/span>
界限后来得到了改善据a target="_blank" rel="nofollow" href="https://dl.acm.org/citation.cfm?id=321884">tarjan.据/a>到据span class="katex"> O.据/mi> (据/mo> α.据/mi> (据/mo> N据/mi> )据/mo> )据/mo> 那据/mo> o \ big(\ alpha(n)\ big),据/annotation> O.据/span>(据/span>α.据/span>(据/span>N据/span>)据/span>)据/span>那据/span>在哪里据span class="katex"> α.据/mi> \α据/annotation> α.据/span>是逆据a target="_blank" rel="nofollow" href="//www.parkandroid.com/problems/ackerman-function/">Ackermann功能据/a>。据/p>
忘记密码?据/a>新用户?据a href="//www.parkandroid.com/account/signup/?signup=true&next=/wiki/disjoint-set-data-structure/" id="problem-signup-link-alternative" class="btn-link ax-click" data-ax-id="clicked_signup_from_problem_modal" data-ax-type="button" data-next="/wiki/disjoint-set-data-structure/">注册据/a>
现有用户?据a href="//www.parkandroid.com/account/login/?next=/wiki/disjoint-set-data-structure/" id="problem-login-link-alternative" class="btn-link ax-click" data-ax-id="clicked_login_from_problem_modal" data-ax-type="button" data-is_modal="true" data-next="/wiki/disjoint-set-data-structure/">登录据/a>
问题加载......据/p>
注意加载......据/p>
设置加载......据/p>