问题→

动态连通性:当程序从输入中读取了整数对p q时,如果已知的所有整数对都不能说明p和q是相连的,那么则将这一对整数写入到输出中。如果已知的数据可以说明p和q

是相连的,那么程序应该忽略p q这对整数并继续处理输入中的下一对整数。

 

该问题的应用→

网络,变量名等价性,数字集合等。

 

设计API→

public class UF
  UF(int N) 以整数标识(0到N-1)初始化N个触点
void union(int p, int q) 在p和q之间添加一条连接
int find(int p) p(0到N-1)所在的分量的标识符
boolean connected(int p, int q) 如果p和q存在于同一个分量中则返回true
int count() 连通分量的数量

 

 

 

 

 

 

为解决动态连通性问题设计算法的任务转化为了实现这份API。

 

quick-find算法→

public class QuickFindUF {

    private int[] id;     // 分量id(以触点作为索引)
    private int count;     // 分量数量

    public QuickFindUF(int N) { // 初始化分量id数组
        count = N;
        id = new int[N];
        for (int i = 0; i < N; i++) {
            id[i] = i;
        }
    }

    public int count() {
        return count;
    }

    public boolean connected(int p, int q) {
        return find(p) == find(q);
    }

    public int find(int p) {
        return id[p];
    }

    public void union(int p, int q) {    // 将p和q归并到相同的分量中
        int pID = find(p);
        int qID = find(q);

        // 如果p和q已经在相同的分量之中则不需要采取任何行动
        if (pID == qID)    return;

        // 将p的分量重命名为q的名称
        for (int i = 0; i < id.length; i++) {
            if (id[i] == pID)    id[i] = qID;
        }

        count--;
    }

    public static void main(String[] args) {     // 解决由StdIn得到的动态连通性问题
        int N = StdIn.readInt();                                // 读取触点数量
        UF uf = new UF(N);                                            // 初始化N个分量
        while (!StdIn.isEmpty()) {
            int p = StdIn.readInt();
            int q = StdIn.readInt();                            // 读取整数对            
            if (uf.connected(p, q))    continue;            // 如果已经连通则忽略
            uf.union(p, q);                                                // 归并分量
            StdOut.println(p + " " + q);                    // 打印链接
        }
        StdOut.println(uf.count() + " components");
    }

}
QuickFindUF

相关文章:

  • 2021-08-23
  • 2021-08-16
  • 2021-07-22
  • 2022-02-10
  • 2021-12-29
  • 2022-02-02
猜你喜欢
  • 2021-04-17
  • 2020-06-26
  • 2022-12-23
  • 2022-12-23
  • 2021-10-04
  • 2021-12-21
相关资源
相似解决方案