Java 用广度优先搜索算法检测无向图中的圈
使用这个算法,我得到了错误的答案,但我的测试用例是错误的 给出正确的答案。让我知道我哪里出错了。在这个 算法我使用了广度优先搜索(BFS)技术来查找 检测循环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方法
类解决方案{
公共布尔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;
}
}