import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdIn;
public class UF
{
private int[] id;
private int[] weight;
private int count;
public UF(int N)
{
count = N;
id = new int[N];
weight = new int[N];
for(int i = 0; i < N; i++)
{
id[i] = i;
weight[i] = 1;
}
}
public int count()
{ return count;}
public boolean connection(int p, int q)
{ return find(p) == find(q);}
public int find(int p)
{
while(id[p] != p) p = id[p];
return p;
}
public void union(int p, int q)
{
int pID = find(p);
int qID = find(q);
if(pID == qID) return ;
if(weight[pID] > weight[qID])
{
id[qID] = pID;
weight[pID] += weight[qID];
}
else
{
id[pID] = qID;
weight[qID] += weight[pID];
}
count--;
}
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.connection(p, q))
continue;
uf.union(p,q);
StdOut.println(p + " " + q);
}
StdOut.println(uf.count() + "components");
}
}
algs4 union-find算法的实现
最新推荐文章于 2023-09-04 23:40:40 发布