0
点赞
收藏
分享

微信扫一扫

无向图的连通分量不相交集合表示

那小那小 2022-07-28 阅读 88



 

package com.data.struct;

import java.util.Random;


public class ConnectedComponent {
private Node[] list;

public ConnectedComponent(int v,int e){
list=new Node[v];
for(int i=0;i<v;i++){
Node node=new Node();
node.id=i;
list[i]=node;
}
for(int i=0;i<e;i++){
int v1=new Random().nextInt(v);
int v2=new Random().nextInt(v);
if(v1==v2){
continue;
}
while(true){
Node node=list[v1];
boolean already=false;
while(node.next!=null){
if(node.next.id==v2){
already=true;
break;
}
node=node.next;
}
if(already==true){
break;
}
Node ex=new Node();
ex.id=v2;
node.next=ex;
break;
}
}
for(int i=0;i<list.length;i++){
makeSet(list[i]);

}
for(int i=0;i<list.length;i++){
Node node=list[i];
Node w=node;
while(node.next!=null){
if(findSet(list[w.id])!=findSet(list[node.next.id])){
union(list[w.id],list[node.next.id]);
}
node=node.next;
}
}

}

public void makeSet(Node x){
x.parent=x;
x.rank=0;
}
public void union(Node x,Node y){
link(findSet(x),findSet(y));
}
private void link(Node x,Node y){
if(x.rank>y.rank){
y.parent=x;
}else{
x.parent=y;
if(x.rank==y.rank){
y.rank++;
}
}

}
public Node findSet(Node x){
if(x.parent!=x){
x.parent=findSet(x.parent);
}
return x.parent;
}

public boolean sameComponent(Node u,Node v){
if(findSet(u)==findSet(v)){
return true;
}else {
return false;
}
}
public static class Node{
private int id;
private Node next;
private Node parent;
private int rank;


}
public static void main(String[] args) {
ConnectedComponent c=new ConnectedComponent(10,5);
System.out.println(c.sameComponent(c.list[0], c.list[1]));

}

}

 

举报

相关推荐

0 条评论