并查集
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Stack;
class Node{
public int v;
public Node(int a){
v =a;
}
}
class bing{
public HashMap<Integer,Node> node;
public HashMap<Node,Node> parent;
public HashMap<Node,Integer> size;
public bing(List<Integer> aa){
node = new HashMap<>();
parent = new HashMap<>();
size = new HashMap<>();
for(Integer a1:aa){
node.put(a1,new Node(a1));
parent.put(node.get(a1),node.get(a1));
size.put(node.get(a1),1);
}
}
public void hebing(int q1,int q2){
Node a1 = node.get(q1);
Node a2 = node.get(q2);
Node a3 = find(a1);
Node a4 = find(a2);
if (a3==a4){
return;
}
Node big = size.get(a3)>size.get(a4)?a3:a4;
Node sam = size.get(a3)<=size.get(a4)?a3:a4;
xiu(big,sam);
}
public int ge(){
return size.size();
}
public Node find(Node a1){
Stack<Node> ae = new Stack<>();
Node z = a1;
while (z!=parent.get(z)){
ae.push(z);
z = parent.get(z);
}
while (!ae.empty()){
Node qq =ae.pop();
parent.put(qq,z);
}
return z;
}
public void xiu(Node big,Node sam){
int dd = size.get(big)+1;
parent.put(sam,big);
size.remove(sam);
int k = size.get(big);
size.put(big,dd);
}
}
public class t {
public static void main(String[] args) {
List<Integer> aa = new ArrayList<>();
int[] arr = {1,2,4,3,5,6};
for (int q:arr){
aa.add(q);
}
bing w =new bing(aa);
w.hebing(1,2);
w.hebing(4,3);
w.hebing(1,4);
int c =w.ge();
System.out.println(c);
}
}
相关算法题
给定一个方阵求其中一共有几个独立的集合
上图就是一个方阵(0,2)的下标是1,(0,3)的下标是1说以0,2,3是属于同一个集合(1,3)的下标是1,又因为3是属于0,2,3这个集合所以要把1也并进去所以0,1,2,3是一个集合;4和其他的数组合都没出现1所以4是单独的一个集合;
所以最终的答案就是2
这道题就可以用并查集来解决
class P{
private int[] parent;
private int[] size;
private int[] help;
private int jj ;
public P(int n){
parent = new int[n];
size = new int[n];
help = new int[n];
jj = n;
for(int i=0;i<n;i++){
parent[i] = i;
size[i] = 1;
}
}
public int geshu(){
return jj;
}
public void pp(int[][] arr){
for(int i = 0;i<arr.length;i++){
for (int k = i+1;k<arr.length;k++){
if(arr[i][k]>0){
hebing(i,k);
}
}
}
}
public void hebing(int a1,int a2){
int q1 = find(a1);
int q2 = find(a2);
if(q1 == q2){
return;
}
int a3 = size[q1];
int a4 = size[q2];
int big = a3>=a4?q1:q2;
int sam = a3<a4?q1:q2;
kk(big,sam);
}
public void kk(int big,int sam){
parent[sam] = big;
size[big]++;
jj--;
}
public int find(int k){
int z = k;
int i = 0;
while (z!=parent[z]){
help[i] = z;
i++;
z = parent[z];
}
for(int k1 = 0;k1<i;k1++){
parent[help[k1]] = z;
}
return z;
}
}
public class t {
public static void main(String[] args) {
int[][] arr = {{1,0,1,1,0},{0,1,0,1,0},{1,0,1,0,0},{1,1,0,1,0},{0,0,0,0,1}};
P kk= new P(5);
kk.pp(arr);
int c =kk.geshu();
System.out.println(c);
}
}