目录
无向连通图的相关定义
- 连通性:在图G中,两个不同的结点u和结点v之间若存在一条路,则称结点u和结点v是连通的。
- 无向连通图:若在无向图G中,任意两点都是连通的,则称图G为连通图。
主要算法流程
DFS判断:
- 从任一结点开始,进行一次深度优先遍历。深度优先遍历的结果是一个图的连通分量。当一次遍历没有访问到所有结点,那么就说明图是不连通。
-
算法步骤及相关分析:
a)算法步骤:
从顶点v出发,访问顶点v,并令visited[v] = 1;
依次查找v的所有邻接点w,若visited[w] 为0,则从w出发,深度优先遍历图。
进行判断,遍历visited数组,若visited数组中有一个值不为1,则说明该点未被访问,图不连通。
b)时间复杂度::算法运行时间主要是耗费在寻找邻接w处,寻找一个符合条件的w的时间复杂度是O(V),V个节点就是O(V^2),尽管可能不会寻找V次。
c)空间复杂度:空间复杂度仅耗费在辅助数组visited[]上,空间复杂度为O(V)。
d)改进:
设置全局静态变量count,记录访问结点的数量,所以判断时不必遍历visited数组,只要判断count值是 否等于结点数量V即可;
visited数组设置为全局变量,与BFS函数共享。
- 代码:
//DFS递归
public void DFS(int[] visited, int v) {
visited[v] = 1;
judgeDFSCount ++;
for(int i=0; i<this.vertexNum; i++) {
if(this.a[v][i] != 0 && visited[i] == 0) //寻找下一个有边的未访问结点
DFS(visited, i);
}
}
//DFS判断,调用DFS递归
public boolean DFSGraph() {
judgeDFSCount = 0; //记录遍历的点个数,为全局变量
boolean flag = false;
visited = new int[this.vertexNum]; //初始数组就是全0
DFS(visited, 0); //从0号结点开始
if(judgeDFSCount == this.vertexNum) //如果遍历的点个数等于图的结点个数
flag = true; //说明一次DFS遍历就搜索了所有的点
return flag;
}
BFS判断:
-
从一个结点开始,访问与其关联的所有结点,将这些结点入队,重复此过程,直至队列为空。访问的结点构成一个连通分量,若该连通分量未包含所有结点,则无向图不连通。
-
算法步骤及相关分析:
a)算法步骤:
从顶点v开始,访问v并置visited[v] = 1,将v入队;
只要队列不空,就重复一下操作:
队首顶点v出队;
依次查找v所有邻接点w,如果visited[w]值为0,则访问w并置visited[w] = 1,将w放入队列中;
进行判断,遍历visited数组,若有一个值不为1,则图就不连通。
b)时间复杂度:BFS的时间复杂度主要是耗费在搜索邻接点上,与DFS类型