union-find

发展一个可用的算法的步骤:
把问题模型化
找到一个算法去解决它
足够快?适合内存?
如果不是,想想为什么
寻找一个方法去解决这个问题
重复直到一切都满意
动态连接(Dynamic connectivity)
我们假设“被连接”是一个相等的关系:
自反:p被p连接
对称:如果p被q连接,那么q也被p连接
传递:如果p被q连接,q被r连接,那么p被r连接
连接集合(Connected components):每个对象被连接的所以元素

发现问题:检查两个对象是否都在同一个集合里面
连接命令:用连接替换两个对象集合

联合查找数据类型(Union-find data type)API
目标 设计有效的数据结构为联合查找
定义一个 UF类
对数据初始化
给数据添加连接
判断数据是否在同一集合内
找到p所在的集合
确定集合的数量

动态连接客户端(Dynamic-connectivity client)
从标准输入中读取n个对象
重复:

  • 从标准输入中读取整数对
  • 如果他们未被连接请将他们连接
    代码
    public static void main(string[] args)
    {
     int N = StdIn.readInt();
     UF uf = new UF(N);
     while (!stdIn.isEmpty())
     {
       int p = stdIn.readInt();
       int q = stdIn.readInt();
       if (!uf.connected(p,q))
       {
         uf.union(p,q);
         stdOut.prtinln(p+" "+q);
       }
      }
    }