判断在一个网络中,两个点是否连通
-
数学建模
- 如何表示整个网络中的点?
- 如何表示两个点连通?
- 如何将给定的点连通?
-
数据结构选取
- 用数组存储整个网络中的点
- 给每个点取值,并用数组下标和点值相对应
- 数组元素相等则表示两个点连通
- 将两个下标对应的元素修改为相同,则表示将给定的点连通
-
代码实现
-
/** * 连通性问题方法 */ public class ConnectQuestion { private int[] ids; /** * 给数组赋初始值 * @return */ ConnectQuestion(int length) { ids = new int[length]; for (int i = 0; i < length; i++) { ids[i] = i; } } /** * 判断连通 */ public Boolean isConnect(int p, int q) { return ids[p] == ids[q]; } /** * 进行连通 */ public void connect(int p, int q) { for (int i = 0; i < ids.length; i++) { //这里会有问题 if (ids[i] == ids[p]) ids[i] = ids[q]; } } }
问题描述:假如第一次p =3 ,i = 3,ids[3] == ids[3] 时,ids[3] = ids[5],此时ids[3]的值已经变为ids[5],那么第二次循环时,判断条件变为ids[i] == ids[5],此时与最初ids[i] == ids[3]相矛盾。
-
应改为:
/** * 进行连通 */ public void connect(int p, int q) { int pid = ids[p]; int qid = ids[q]; for (int i = 0; i < ids.length; i++) { if (ids[i] == pid) { ids[i] = qid; } } }