<强>深度优先遍历强>
深度优先遍历类似于一个人走迷宫:
如图所示,从起点开始选择一条边走到下一个顶点,没到一个顶点便标记此顶点已到达。
当来到一个标记过的顶点时回退到上一个顶点,再选择一条没有到达过的顶点。
当回退到的路口已没有可走的通道时继续回退。
而<>强连通分量>强,看概念:无向图G的极大连通子图称为G的连通分量(连接组件)。任何连通图的连通分量只有一个,即是其自身,非连通的无向图有多个连通分量。
下面看看具体实例:
包com.dataStructure.graph;//求无权图的联通分量 公共类组件{ 私人图图;//存放输入的数组 私人布尔[]访问;//存放节点被访问状态 私人int componentCount;//连通分量的数量 私人int[]马克;//存储节点所属联通分量的标记//构造函数,初始化私有属性 公共组件(图图){ 这一点。图=图; componentCount=0;//连通分量初始数量为0 访问=新布尔[graph.V ()]; 马克=new int [graph.V ()); for (int i=0;我& lt;graph.V ();我+ +){ 参观了[我]=false;//节点初始访问状态为假 马克[我]=1;//节点初始连通分量标记为1 } for (int i=0;我& lt;graph.V ();我+ +){//对于未被访问的节点进行dfs深度优先遍历 如果(!访问[我]){ dfs(我); componentCount + +;//对一个节点进行dfs到底后,一个连通分量结束,数量+ 1 } } } 私人空间dfs (int i) { 参观了[我]=true;//节点我已被访问 马克[我]=componentCount;//节点我属于当前连通分量的数量(标记) (int节点:graph.adjacentNode(我)){//遍历图中节点我的邻接节点 如果访问(节点)(!)//对未被访问的邻接节点进行dfs dfs(节点); } } 公共布尔与(int, int w) { 返回马克马克[w]; [v]==//根据两节点所属连通分量的标记判断两节点是否相连 } 公共int getComponentCount () { 返回componentCount;//返回图中连通分量的数量 } } {//公共类组件////私有图G;//图的引用//私布尔[]访问;//记录dfs的过程中节点是否被访问//私人int平仓;//记录联通分量个数//私人int [] id;//每个节点所对应的联通分量标记//////图的深度优先遍历//私人空dfs (int v) {////访问[v]=true;//节点v的访问状态置为真实的//id [v]=平仓;//节点v对应的联通标记设置为平仓//////遍历节点v的邻接我点//(int i: G.adjacentNode (v)) {////如果邻接点我尚未被访问//如果(!访问[我])////对邻接点我进行深度优先遍历//dfs(我);//}//}//////构造函数,求出无权图的联通分量//公共组件(图图){//////算法初始化//G=图;//////访问数组存储图G中节点的被访问状态//访问=新布尔[G.V ());//////id数组存储图G中节点所属连通分量的标记//id=new int [G.V ());//////连通分量数量初始化为0//平仓=0;//////将访问数组全部置为假;id数组全部置为1//(int i=0;我& lt;G.V ();我+ +){//访问[我]=false;//id[我]=1;//}//////求图的联通分量//(int i=0;我& lt;G.V ();我+ +)////访问一个未曾被访问的节点//如果(!访问[我]){////对其进行深度优先遍历//dfs(我);//平仓+ +;//}//}//////返回图的联通分量个数//int数(){//返回平仓;//}//////查询点v和点w是否联通(节点v和w的联通分量的标记是否相同 v//布尔与(int, int w) {//维护v祝辞=0,,v & lt;G.V ();//维护w祝辞=0,,w & lt;G.V ();//返回id [v]==id [w];//}//}
通分量数量为3
以上就是本文关于Java编程实现深度优先遍历与连通分量代码示例的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。关注,您会有更多收获。