publicclassUnionFindSet{// 节点数privateintN=1005;// 每个节点的父节点privateint[] father =newint[N];/**
* 并查集初始化
*/publicvoidinit(){for(int i =0; i <N; i++) father[i]= i;}/**
* 查询节点的父节点下标(路径压缩)
* @param u 待查询父节点的下标
* @return 父节点下标
*/publicintfind(int u){return u == father[u]? u :(father[u]=find(father[u]));}/**
* 判断两个节点是否属于同一个集合,即他们的父节点是否相同
* @param u 节点一
* @param v 节点二
* @return 输入的两个节点是否属于同一个集合,是=true,否=false
*/publicbooleanisSame(int u,int v){
u =find(u);
v =find(v);return u == v;}/**
* 将边 u <- v 加入集合
* @param u 待加入边的父节点
* @param v 待加入边的子节点
*/publicvoidjoin(int u,int v){
u =find(u);
v =find(v);if(u == v)return;
father[v]= u;}}
classSolution{privateint[] father;publicbooleanvalidPath(int n,int[][] edges,int source,int destination){
father =newint[n];init();for(int i =0; i < edges.length; i++)join(edges[i][0], edges[i][1]);returnisSame(source, destination);}privatevoidinit(){for(int i =0; i < father.length; i++) father[i]= i;}privatevoidjoin(int u,int v){
u =find(u);
v =find(v);if(u == v)return;
father[v]= u;}privateint find (int u){return u == father[u]? u :(father[u]=find(father[u]));}privateboolean isSame (int u,int v){
u =find(u);
v =find(v);return u == v;}}