Quick Union

  • 逻辑:
    将点连成如图所示的树状图,如果两个点具备一个相同的根,那么说明两点之间相连。


    image.png
image.png

……


image.png
  • Java:
public class QuickUnionUF
{
    private int[] id;
    // 初始化array
    public QuickUnionUF(int N)
    {
        id = new int[N];
        for (int i = 0; i < N; i++) id[i] = i;
    }
    // 组成树,并返回根
    private int root(int i) 
    {
        while (i != id[i]) i = id[i];
        return i;
    }
    // 检测两点是否连接
    public boolean connected(int p, int q)
    {
        return root(p) == root(q);
    }
    // 形成union
    public void union(int p, int q)
    {
        int i = root(p);
        int j = root(q);
        id[i] = j;
    }
}

Java的代码很好理解,下面是C++的代码,就略显凌乱了:

#include <iostream>
using namespace std;
const int N = 10;
// 
int main()
{
    int i,j,p,q,id[N];
    // 初始化array,相当于Java中的QuickUnionUF方法
    for(i = 0; i < N; i++) {
        id[i] = i;
    }
    // 输入两点坐标,如果两点之前未连接,则返回两点坐标
    while (cin >> p >> q){
        // 功能类似Java代码中的root方法,i最后等于根的坐标
        for (i = p; i != id[i]; i = id[i]);
        // 功能类似Java代码中的root方法,j最后等于根的坐标
        for (j = q; j != id[j]; j = id[j]) ;
        // 此时i和j都为根的坐标,比较根坐标;根相同,则两点相连,跳过之后的代码,开始新的循环
        if (i == j) continue; 
        // 根不同,则连接两点,创建新的union
        id[i] = j; 
        // 返回没有相连的两点的坐标
        cout << " " << p << " " << q << endl;
    } 
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,724评论 25 709
  • 出来生命本身,没有任何才能不需要后天的锻炼。水不积不辽阔,人不养不成才,困境是造就强者的学校。
    Elaine山木阅读 3,902评论 0 0
  • http://www.cssue.com/xhtml-css/html5-css3/mobile-meta.htm...
    6659a0f02826阅读 2,593评论 0 0
  • 孟子曰:事孰为大?事亲为大。守孰为大?守身为大。不失其身而能事其亲者,吾闻之矣;失其身而能事其亲者,吾未之闻也。孰...
    济之阅读 2,790评论 0 0
  • 鉴于近期经常有朋友找我装系统,或者在装系统时遇到这样那样的问题,觉得还是写一篇文章来跟大家分享分享吧 1.首先你得...
    dravenxiaokai阅读 10,393评论 4 8