并查集判断是否有环存在

并查集判断是否有环存在题目描述思路分析代码实现packagecom.atguigu.disjointSet;publicclassdjset{publicstaticintVERTICES=6;publicstaticvoidinitialise(intparent[]){inti;for(i=0;i<VERTICES;i++){parent[i]=-1;}

大家好,欢迎来到IT知识分享网。

题目描述

在这里插入图片描述

思路分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

package com.atguigu.disjointSet;

public class djset { 
   
    public static int VERTICES=6;
    public static void initialise(int parent[]){ 
   
        int i;
        for (i = 0; i < VERTICES; i++) { 
   
            parent[i]=-1;
        }
    }

    public static int find_root(int x,int parent[]){ 
   
        int x_root=x;
        while (parent[x_root]!=-1){ 
   
            x_root=parent[x_root];
        }
        //出了循环说明已经找到父节点
        return x_root;
    }

    /* 返回1表示union成功 合并成功,0表示合并失败 */
    public static int union_vertices(int x,int y,int parent[]){ 
   
        int x_root=find_root(x,parent);
        int y_root=find_root(y,parent);
        if(x_root==y_root){ 
   //x,y的父节点相同
            return 0;
        }else { 
   
            parent[x_root]=y_root;
            return 1;
        }
    }

    public static void main(String[] args) { 
   
        int parent[]=new int[VERTICES];
        int edges[][]={ 
   { 
   0,1},{ 
   1,2},{ 
   1,3},
                { 
   2,4},
              { 
   3,4},{ 
   2,5}};
        initialise(parent);
        int i;
        for ( i = 0; i < edges.length; i++) { 
   
            int x=edges[i][0];
            int y=edges[i][1];
            if(union_vertices(x,y,parent)==0){ 
   
                System.out.println("存在环");
                return;
            }
        }
        System.out.println("不存在环");
    }
}

压缩路径

package com.atguigu.disjointSet;

public class djset { 
   
    public static int VERTICES=6;
    public static void initialise(int parent[]){ 
   
        int i;
        for (i = 0; i < VERTICES; i++) { 
   
            parent[i]=-1;
        }
    }

    public static int find_root(int x,int parent[]){ 
   
        int x_root=x;
        while (parent[x_root]!=-1){ 
   
            x_root=parent[x_root];
        }
        //出了循环说明已经找到父节点
        return x_root;
    }

    /* 返回1表示union成功 合并成功,0表示合并失败 */
    public static int union_vertices(int x,int y,int parent[],int rank[]){ 
   
        int x_root=find_root(x,parent);
        int y_root=find_root(y,parent);
 		if(x_root==y_root){ 
   //x,y的父节点相同
            return 0;
        }else { 
   
            if(rank[x_root]>rank[y_root]){ 
   
                parent[y_root]=x_root;
            }else if(rank[y_root]>rank[x_root]){ 
   
                parent[x_root]=y_root;
            }else { 
   
                parent[x_root]=y_root;
                rank[y_root]++;
            }
        }
    }

    public static void main(String[] args) { 
   
        int parent[]=new int[VERTICES];
        int rank[]=new int[VERTICES];
        int edges[][]={ 
   { 
   0,1},{ 
   1,2},{ 
   1,3},
                { 
   2,4},
              { 
   3,4},{ 
   2,5}};
        initialise(parent);
        int i;
        for ( i = 0; i < edges.length; i++) { 
   
            int x=edges[i][0];
            int y=edges[i][1];
            if(union_vertices(x,y,parent,rank)==0){ 
   
                System.out.println("存在环");
                return;
            }
        }
        System.out.println("不存在环");
    }
}

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/11093.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信