发展一个可用的算法的步骤:
把问题模型化
找到一个算法去解决它
足够快?适合内存?
如果不是,想想为什么
寻找一个方法去解决这个问题
重复直到一切都满意
动态连接(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); } } }