import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
public class UF_1
{
private int[] id;
private int[]sz;
private int count;
public UF_1(int N)
{
count=N;
id = new int[N];
for(int i = 0; i<N ; i++)
id[i]=i;
sz = new int[N];
for(int i=0;i<N;i++)
sz[i]=1;
}
public void union(int p, int q)
{
int i = find(p);
int j = find(q);
if ( i== j )
return;
if(sz[p]<sz[q])
{
id[i] = j;
sz[j] += sz[i];
}
else {
id[j] =i;
sz[i] = sz[j];
}
count--;
}
public int find (int p)
{
while(p != id[p])
{
id[p]=id[id[p]];
p = id[p];
}
return p;
}
public boolean connected (int p, int q)
{
return find(p) == find(q);
}
public int count()
{
return count;
}
public static void main(String[] args)
{
int N = StdIn.readInt();
UF_1 uf = new UF_1(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");
}
}
算法 1.5节:带路径压缩的加权并查集
最新推荐文章于 2024-07-13 19:02:45 发布