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);
}
}
}
您的想法是使用深度优先搜索,同时将节点标记为已访问,以确定是否强连接是一个好主意。
不需要第一个double for循环。如果图实际上是强连通的,那么我们从哪个节点开始并不重要。
首先,我注意到您在DFS搜索中这样做:
visited[i] == false
DFS1(adjlist, i, visited);
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);
}
}
作为一项练习,我必须建立一个卫星导航系统,规划从一个位置到另一个位置的最短和最快路线。它必须尽可能快,而不需要使用太多内存。 我很难决定使用哪种结构来表示图形。我知道矩阵更适合密集图,列表更适合稀疏图。我更倾向于使用列表,因为我认为添加顶点将是这个程序中最累人的部分。 我只是想听听你们的意见。如果我把一个典型的路线图看作一个图形,其中不同的位置是节点,道路是边缘。你认为它是稀疏的还是密集的?在这种
大家好:)今天我正在提高我在图论和数据结构方面的技能。我决定用C++做一个小项目,因为我已经有一段时间没有用C++了。 我想为一个有向图做一个邻接表。换句话说,看起来像: 这将是一个有向图,其中V0(顶点0)对V1和V3有一条边,V1对V2有一条边,V2对V4有一条边,如下所示:
我把《算法导论》第3版第22行22.3-13中单连通图的定义引用为。我注意到图中的圈并不一定意味着图不是单连通的,因为包含圈的路径不被认为是简单路径。有向图中的一个简单圈可以由相应的边集唯一地表示。让我们考虑一个满足以下两个性质的有向图: (1)它的DFS林中只有树边和后边,(2)图中表示每个简单圈的集合都是不相交的(即它们不共享任何边)。现在我的问题是:满足以上两个条件的有向图一定是单连通图吗?
我试着检查一个链表的最后一个节点是否指向头部。这段代码似乎为问题给出了肯定的结果,但也为包含指向非头节点的节点的列表给出了假肯定。 我尝试了不同的方法,比如检查慢节点是否等于返回true点的head,但这似乎不起作用。 有什么建议吗?
很明显,在图中不应该有任何交叉边或前向边。但是后缘呢?
在书中,他们做过这样的宣示: 我应该如何将下面图的输入作为邻接表并输出它的邻接表表示?假设,edge的每个成本是10。