java - 使用邻接表检查有向图是否强连接
问题描述
我需要找出给定的邻接列表(int [] [])是否描述了一个强连接图。我在图中的几个节点超过 2 个的测试用例中失败了。例如 adjlist = new int[][] {{ 1 },{ 2 },{ 0 },}; 这意味着节点0(列表中的第一个)可以连接到节点1,节点1可以连接到节点2,节点2可以连接到节点0。我试过这个:
public boolean allDevicesConnected(int[][] adjlist) {
Boolean[] visited = new Boolean[adjlist.length];
for (int i = 0; i < adjlist.length; i++) {
for (int b = 0; b < visited.length; b++) {
visited[b] = false;
}
DFS1( adjlist, i, visited);
}
for (int j = 0; j < visited.length; j++) {
if (visited[j] == false) {
return false;
}
}
return true;
}
private static void DFS1(int[][] adjlist, int v, Boolean[] visited) {
visited[v] = true;
for (int i = 0; i < adjlist[v].length; i++) {
if (visited[i] == false) {
DFS1(adjlist, i, visited);
}
}
}
任何帮助都会非常感谢!
解决方案
您使用深度优先搜索的想法,同时将节点标记为已访问以确定是否强连接是一个好主意。
不需要第一个双 for 循环。如果图实际上是强连接的,那么我们从哪个节点开始并不重要。
首先,我注意到您在 DFS 搜索中这样做:
visited[i] == false
和
DFS1(adjlist, i, visited);
也就是说,当你这样做时,你没有检查正确的节点。您应该检查的不是索引 i,而是存储在索引 i 处的节点的实际值。
我编辑了你的代码来使用这个想法:
public boolean allDevicesConnected(int[][] adjlist){
boolean[] marked = new boolean[adjlist.length]; // Default is set to false
DFS_helper(0, adjlist, marked);
for(boolean b : marked)
if(b == false) return false;
return true;
}
public void DFS_helper(int node, int[][] adjlist, boolean[] marked){
marked[node] = true;
for (int i = 0; i < adjList[node].length; i++) {
int dest = adjlist[node][i];
if(marked[dest] == false)
DFS_helper(dest, adjlist, marked);
}
}
推荐阅读
- html - 如何在angular8中将对象数组循环为单独的表
- python - 使用 Python 从巨大的数据库表中提取数据并创建多个 CSV 文件
- influxdb - 在 InfluxDB 中看不到插入的数据
- azure-devops - Power Automate 与 Azure DevOps Boards 集成 - 使用父链接创建新问题
- python - 使用 Apache Beam 中的滑动窗口方法从无界流中删除重复事件
- database - 找出数据库规范化中的依赖关系树
- amazon-s3 - 未知选项:arn:aws:iam::111111111:mfa/User
- javascript - 使用 div 类号开户
- kubernetes - 无法读取 Vault 机密 - 使用 Vault Sidecar Injector
- linux - 如何仅使用一个命令获取所有常规文件和长列表