【发布时间】:2021-05-04 14:56:27
【问题描述】:
使用这个算法我得到了错误的答案,但我的测试用例是 给出正确答案。让我知道我哪里出错了。在这个 算法我使用广度优先搜索(BFS)技术来找到 检测循环。
// 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;
}
}
【问题讨论】:
-
你的回答有什么“错误”?
-
for (int i : adj.get(cur))很可疑。您期望i成为vis[i]中的顶点(索引),但实际上您将i作为边权重。您可以使用经典的for语句而不是增强的for语句来更正它。显然还有像if(vis[i]) // break and return这样的其他问题。 -
@AniketSahrawat,您能否详细说明 1.
for声明和 2.if (vis[i])。假设未加权的无向图表示为顶点的邻接列表,则for循环正确获取相邻顶点。此外,此代码将适用于连接图。不同的森林需要额外调用该方法。