java图的深度优先遍历,图的遍历的实现
00-1010 1.图的遍历2。深度优先遍历3。用DFS判断有向图中是否有环4。广度优先遍历
00-1010从图中的一个顶点访问图中的其余顶点,每个顶点只访问一次。
图的遍历有两种:深度优先遍历DFS和广度优先遍历BFS。
00-1010深度优先遍历遍历以深度为优先级。简单来说就是每次都要走到最后。类似二叉树的前序遍历
想法:
1.以一个顶点为起点先遍历深度,标记该顶点已经被访问过。
2.以顶点为起点,选择任意一条路径遍历到终点,标记访问过的顶点。
3.第二步:遍历到终点后回到上一个顶点,重复第二步。
4.遍历所有顶点结束。
按照遍历的思路,这是一个递归的过程,但是DFS基本上和回溯是一样的。
遍历:
以此图为例先遍历深度。
静态void dfs(int[][] graph,int idx,boolean[]visit){ int len=graph . length;//visited if(visit[idx])返回;//访问顶点system . out . println( V idx);//标记顶点访问[idx]=true;for(int I=1;我lenI) {//访问所有边if (graph [idx] [i]==1)由此顶点连接{//递归遍历dfs (graph,I,Visit);}}}遍历结果:
第五颅神经的眼支
V2
V3
V4
V5
V6
V7
V8
V9
创建图表的代码:
public static void main(String[]args){ Scanner Scanner=new Scanner(system . in);//顶点数从1 int开始n=scanner . nextint();int[][]graph=new int[n 1][n 1];//边数int m=scanner . nextint();for(int I=1;I=m;I){ int v1=scanner . nextint();int v2=scanner . nextint();图形[v1][v2]=1;图形[v2][v1]=1;}//标记数组false表示boolean[] visit=new boolean[n 1]未被访问;dfs(图,1,访问);}
00-1010思路:遍历某个顶点时,如果除了前一个顶点之外,还有其他连通的顶点被访问过,那么一定有一个环。
//默认非循环静态布尔标志=falsepublic static void main(String[]args){ Scanner Scanner=new Scanner(system . in);//顶点数从1 int开始n=scanner . nextint();int[][]graph=new int[n 1][n 1];//边数int m=scanner . nextint();for(int I=1;I=m;I){ int v1=scanner . nextint();int v2=scanner . nextint();图形[v1][v2]=1;}//标记数组true is visited boolean[]visit=new boolean[n 1];dfs(图,1,访问,1);if(flag)system . out . println( with a loop );}static void dfs(int[][] graph,int idx,boolean[]visit,int parent){ int len=graph . length;system . out . println( V idx);//标记顶点访问[idx]=true;for(int I=1;我lenI) {//访问此顶点连接的所有边if(graph[idx][i]==1) {if(!visit[i] ) { dfs(graph,I,visit,idx);} else if(idx!=I){ flag=true;}}}}注意:确定有无环的是有向图,无向图确定有无环没有意义,因为任意两条现有路径的顶点都可以是环。
00-1010广度优先遍历基于广度(宽度)。类似二叉树的序列遍历
想法:
1.以一个顶点为起点先遍历广度,标记该顶点已经被访问过。
2.访问与该顶点相连且未被访问过的所有顶点,并标记已访问过的顶点。
3.以步骤2中获得的顶点为起点,重复步骤1和2。
4.遍历所有顶点结束。
遍历由队列辅助,队列出队顺序是广度优先遍历的结果。
横贯
以这个图为例,用邻接矩阵创建图,进行BFS遍历。
静态void bfs(int[][]graph){ int len=graph . length;//标记数组false表示boolean[] visit=new boolean[len]未被访问过;//辅助队列queue integer queue=newlinkedlist();queue . offer(1);visit[1]=true;而(!queue . isempty()){ int num=queue . poll();system . out . println( V num);//遍历此顶点的所有连接顶点(int I=1;我lenI) {//连接且未访问if(graph[num][i]==1!visit[I]){ queue . offer(I);visit[I]=true;}}}}遍历结果:
第五颅神经的眼支
V2
V6
V3
V7
V9
V5
V4
V8
用于创建图表的代码
public static void main(String[]args){ Scanner Scanner=new Scanner(system . in);//顶点数从1 int开始n=scanner . nextint();int[][]graph=new int[n 1][n 1];//边数int m=scanner . nextint();for(int I=1;I=m;I){ int v1=scanner . nextint();int v2=scanner . nextint();图形[v1][v2]=1;图形[v2][v1]=1;}bfs(图);}就是这样。这篇关于Java从简单到深入的遍历的文章向您展示了如何掌握图形。关于Java图遍历的更多信息,请搜索Popular IT之前的文章或者继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。