package algorithm;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
class UnionFind{
int MAX = 17;
int father[] = new int[MAX];
int rank[] = new int[MAX];
int indegree[] = new int[MAX];
int visited[] = new int[MAX];
HashMap<Integer, ArrayList<Integer>> tree,query;
int ancestor[] = new int[MAX];
PrintWriter writer;
void init(int n){
for(int i = 1; i <= n; i++){
father[i] = i;
rank[i] = 1;
indegree[i] = 0;
visited[i] = 0;
ancestor[i] = 0;
}
try {
writer = new PrintWriter(new BufferedOutputStream(new FileOutputStream("C:\\a.txt")),true);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
int Find_Set1(int x){
if(x != father[x])
father[x] = Find_Set(father[x]);
return father[x];
}
int Find_Set(int x){
if(x == father[x])
return x;
else
father[x] = Find_Set(father[x]);
return father[x];
}
int Union(int x, int y){
int a = Find_Set(x);
int b = Find_Set(y);
if(a == b)
return 0;
if(rank[a] >= rank[b]){
father[b] = a;
writer.println("father["+b+"]="+a);
rank[a] += rank[b];
}else{
father[a] = b;
writer.println("father["+a+"]="+b);
rank[b] += rank[a];
}
return 1;
}
void LCA1(int u){
ancestor[u] = u;
if(tree.get(u) != null)
for(int unode : tree.get(u)){
LCA(unode);
Union(u, unode);
ancestor[Find_Set(u)] = u;
}
visited[u] = 1;
if(query.get(u) != null)
for(int vnode : query.get(u)){
if(visited[vnode] == 1)
System.out.println(u + "和" + vnode +"的最近公共祖先为 :" + ancestor[Find_Set(vnode)]);
}
}
void LCA(int u){
//System.out.println("u进入 u= "+u);
writer.println("u进入 u= "+u);
ancestor[u] = u;
//System.out.println("ancestor["+u+"]="+u);
writer.println("ancestor["+u+"]="+u);
if(tree.get(u) != null){
ArrayList<Integer> ulist = tree.get(u);
for(int unode : ulist){
LCA(unode);
// System.out.println("return ");
// System.out.println("合并 "+u +"和"+unode);
writer.println("return " );
writer.println("合并 "+u +"和"+unode);
Union(u, unode);
ancestor[Find_Set(u)] = u;
// System.out.println("Find_Set("+u+")="+Find_Set(u));
// System.out.println("ancestor["+u+"]="+Find_Set(u));
writer.println("Find_Set("+u+")="+Find_Set(u));
writer.println("ancestor["+Find_Set(u)+"]="+u);
}
}
visited[u] = 1;
// System.out.println(u+" 访问标志置1");
writer.println(u+" 访问标志置1");
if(query.get(u) != null){
writer.println("query "+u+" 不为空");
ArrayList<Integer> vlist = query.get(u);
for(int vnode : vlist){
if(visited[vnode] == 1){
System.out.println(u + " 和 " + vnode +" 的最近公共祖先为 :" + ancestor[Find_Set(vnode)]);
writer.println(u + " 和 " + vnode +" 的最近公共祖先为 :" + ancestor[Find_Set(vnode)]);}
}
}
}
void commonAncestor(int x, int y){
int n = 16;
init(n);
tree = new HashMap<Integer, ArrayList<Integer>>();
query = new HashMap<Integer, ArrayList<Integer>>();
ArrayList<Integer> list1 = new ArrayList<Integer>();
list1.add(5); indegree[5]++;
list1.add(4);indegree[4]++;
list1.add(1);indegree[1]++;
tree.put(8, list1);
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(9);indegree[9]++;
tree.put(5, list2);
ArrayList<Integer> list3 = new ArrayList<Integer>();
list3.add(6);indegree[6]++;
list3.add(10);indegree[10]++;
tree.put(4, list3);
ArrayList<Integer> list4 = new ArrayList<Integer>();
list4.add(14);indegree[14]++;
list4.add(13);indegree[13]++;
tree.put(1, list4);
ArrayList<Integer> list5 = new ArrayList<Integer>();
list5.add(15);indegree[15]++;
list5.add(7);indegree[7]++;
tree.put(6, list5);
ArrayList<Integer> list6 = new ArrayList<Integer>();
list6.add(11);indegree[11]++;
list6.add(16);indegree[16]++;
list6.add(2);indegree[2]++;
tree.put(10, list6);
ArrayList<Integer> list7 = new ArrayList<Integer>();
list7.add(3);indegree[3]++;
list7.add(12);indegree[12]++;
tree.put(16, list7);
ArrayList<Integer> q = new ArrayList<Integer>();
q.add(x);
ArrayList<Integer> q2 = new ArrayList<Integer>();
q2.add(y);
query.put(x, q2);
query.put(y, q);
LCA(8);
/*System.out.println(uf.tree);
System.out.println(uf.query);
System.out.println(uf.indegree);
for(int i = 0; i < indegree.length; i++)
System.out.print(indegree[i] + " ");
*/
/*for(int i = 1; i <= n; i++){
if(indegree[i] == 0){
uf.LCA(i);
break;
}
}*/
}
}
//并查集 + DFS 求最近公共祖先
public class UnionFind1 {
public static void main(String[] a){
UnionFind uf = new UnionFind();
uf.commonAncestor(9, 7);
}
}
并查集求最近公共祖先
最新推荐文章于 2022-10-15 10:35:25 发布