Java 用广度优先搜索算法检测无向图中的圈

Java 用广度优先搜索算法检测无向图中的圈,java,algorithm,graph,dsa,Java,Algorithm,Graph,Dsa,使用这个算法,我得到了错误的答案,但我的测试用例是错误的 给出正确的答案。让我知道我哪里出错了。在这个 算法我使用了广度优先搜索(BFS)技术来查找 检测循环 //使用bfs方法 类解决方案{ 公共布尔isCycle(int V,ArrayList adj){ 队列q=新的LinkedList(); 布尔vis[]=新布尔[V]; int parent[]=新的int[V]; 父项[0]=-1; q、 加(0); vis[0]=真; 而(!q.isEmpty()){ int cur=q.poll

使用这个算法,我得到了错误的答案,但我的测试用例是错误的 给出正确的答案。让我知道我哪里出错了。在这个 算法我使用了广度优先搜索(BFS)技术来查找 检测循环

//使用bfs方法
类解决方案{
公共布尔isCycle(int V,ArrayList adj){
队列q=新的LinkedList();
布尔vis[]=新布尔[V];
int parent[]=新的int[V];
父项[0]=-1;
q、 加(0);
vis[0]=真;
而(!q.isEmpty()){
int cur=q.poll();
for(inti:adj.get(cur)){
//如果(vis[i]==true)返回true;
如果(!vis[i]){
q、 加(i);
父[i]=cur;
vis[i]=真;
}
如果(parent[cur]!=i)返回true,则返回else;
}
}
返回false;
}
}
假设 该方法假设输入无向图是连通的

请检查这是否是问题域所有可能输入的有效假设

可能的解决办法
  • 现有方法适用于单个林
  • 向现有方法中添加额外的
    startNode
    visted
    参数
  • 添加另一个包装器方法,该方法将为每个未访问的节点(林)调用现有方法
  • 
    布尔hasCycle(最终整数N,最终列表图){
    最终布尔值[]=布尔值[N];
    对于(int-vertex=0;顶点
    两种方法
    boolean hasCycle(final int N,final int start,final boolean[]已访问,final List graph){
    访问[开始]=真;
    最终整数父项[]=新整数[N];
    父级[开始]=-1;
    最终队列q=新的LinkedList();
    q、 添加(开始);
    而(!q.isEmpty()){
    final int node=q.poll();
    //假设对于没有边的节点,将返回一个空列表
    for(int adj:graph.get(node)){
    如果(!访问过[adj]){
    q、 添加(adj);
    父[adj]=节点;
    访问过的,访问过的;
    }else if(父[节点]!=adj){
    返回true;
    }
    }
    }
    返回false;
    }
    布尔hasCycle(最终整数N,最终列表图){
    最终布尔值[]=布尔值[N];
    对于(int-vertex=0;顶点
    免责声明
    这是未经测试且未编译的代码(键入SO)

    您的答案有什么“错误”?
    for(int i:adj.get(cur))
    是可疑的。您希望
    i
    成为
    vis[i]
    中的顶点(索引),但实际上您得到的是
    i
    作为边权重。您可以使用经典的
    for
    语句而不是增强的
    for
    语句来更正它。显然还有其他的问题,比如
    if(vis[i])//break and return
    @AniketSahrawat,你能详细解释一下吗<代码>用于
    语句和,以及2<代码>如果(vis[i])
    。假设未偏移的无向图表示为顶点的邻接列表,则
    for
    循环正确地获取相邻顶点。此外,此代码将适用于连通图。对于不同的林,需要对该方法进行其他调用。
    // Using bfs approach
    class Solution{
        public boolean isCycle(int V, ArrayList<ArrayList<Integer>> adj){
            Queue<Integer> q=new LinkedList<>();
            boolean vis[]=new boolean[V];
            int parent[]=new int[V];
            parent[0]=-1;
            q.add(0);
            vis[0]=true;
            while(!q.isEmpty()){
                int cur=q.poll();
                for(int  i:adj.get(cur)){
                    // if(vis[i]==true) return true;
                    if(!vis[i]){
                        q.add(i);
                        parent[i]=cur;
                        vis[i]=true;
                    }
                    else if(parent[cur]!=i) return true;
                }
            }
            return false;
        }
    }