无向图连通性判断的五种方法(BFS、DFS、Union-find、Warshell、Tarjan)

目录

无向连通图的相关定义

主要算法流程

 DFS判断:

BFS判断:

Warshell判断:

Union-Find判断:

Tarjan判断:


无向连通图的相关定义

  1. 连通性:在图G中,两个不同的结点u和结点v之间若存在一条路,则称结点u和结点v是连通的。
  2. 无向连通图:若在无向图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类型
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值