一、quick-find:
import java.util.Scanner;
public class UF //quick-find
{
private int[] id;
private int count;
public UF(int N)
{
count = N;
id = new int[N];
for (int i = 0; i < N; i++)
id[i] = i;
}
public void union(int p, int q)
{
int pID = id[p];
int qID = id[q];
if (pID == qID) return;
for (int i = 0; i < id.length; i ++)
if (id[i] == pID) id[i] = qID;
count--;
return;
}
public int find(int p)
{
return id[p];
}
public boolean connected(int p, int q)
{
return find(p) == find(q);
}
public int count()
{
return count;
}
public static void main(String[] args)
{
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int N = input.nextInt();
UF uf = new UF(N);
while (input.hasNextInt())
{
int p = input.nextInt();
int q = input.nextInt();
if (uf.connected(p, q)) continue;
else uf.union(p, q);
}
System.out.println(uf.count() + "components");
}
}
二、quick-union:
import java.util.Scanner;
public class UF //quick-union
{
private int[] id;
private int count;
public UF(int N)
{
count = N;
id = new int[N];
for (int i = 0; i < N; i++)
id[i] = i;
}
public void union(int p, int q)
{
int pRoot = find(p);
int qRoot = find(q);
if (pRoot == qRoot) return;
id[pRoot] = qRoot;
count--;
return;
}
public int find(int p)
{
while (p != 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)
{
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int N = input.nextInt();
UF uf = new UF(N);
while (input.hasNextInt())
{
int p = input.nextInt();
int q = input.nextInt();
if (uf.connected(p, q)) continue;
else uf.union(p, q);
}
System.out.println(uf.count() + "components");
}
}
三加权 quick-union;
import java.util.Scanner;
public class UF //quick-union
{
private int[] id;
private int count;
private int[] sz;
public UF(int N)
{
count = N;
id = new int[N];
sz = new int[N];
for (int i = 0; i < N; i++)
id[i] = i;
for (int i = 0; i < N; i++)
sz[i] = 1;
}
public void union(int p, int q)
{
int pRoot = find(p);
int qRoot = find(q);
if (pRoot == qRoot) return;
if (sz[pRoot] < sz[qRoot]) {id[pRoot] = qRoot; sz[qRoot] += sz[pRoot];}
else {id[qRoot] = pRoot; sz[pRoot] += sz[qRoot];}
//id[pRoot] = qRoot;
count--;
return;
}
public int find(int p)
{
while (p != 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)
{
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int N = input.nextInt();
UF uf = new UF(N);
while (input.hasNextInt())
{
int p = input.nextInt();
int q = input.nextInt();
if (uf.connected(p, q)) continue;
else uf.union(p, q);
}
System.out.println(uf.count() + "components");
}
}