对于边比较稠密的图,可以采用邻接矩阵(以顶点为中心)的方式表示,而边比较稀疏时,采用邻接表的结构更合适。两种都不能直观表达哪两个点相连或者最短路径是什么。
深度优先遍历类似于树的先根序遍历。与树不同的是,它需要对已经访问过的节点添加标记以免被重复遍历。
public class Depth { /** * 对k号节点深度遍历 * @param a * @param color * @param k 节点 */ public static void depthTraversal(int[][] a,int[] color,int k){ System.out.println(k); color[k]=1;//0未染色,1染色表示遍历过 //找到与k连接的 for(int i=0;i<a[k].length;i++){ if(a[k][i]==1&&color[i]==0){ depthTraversal(a,color,i); } } } /** * @param args */ public static void main(String[] args) { //邻接矩阵标记是否相连,1表示相连,0表示不连 int[][] a={ {0,1,1,1,0}, {1,0,1,1,1}, {1,1,0,1,1}, {1,1,0,0,1}, {1,1,1,1,0} }; //需要一个数组来记录染色信息, int[] color=new int[a.length];//int数组内部默认值为0 depthTraversal(a,color,0); } }
广度优先遍历类似于对树进行逐层遍历。它按照与开始节点的距离由近到远地进行遍历。当然,因为图的特点,也需要对遍历过的节点做标记。
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class Breadth { /** * @param args */ @SuppressWarnings("unchecked") public static void main(String[] args) { //邻接矩阵标记是否相连,稠密的图,我们的写法可以是邻接表 int[][] a={ {0,1,1,1,0,1}, {1,0,1,1,1,0}, {1,1,0,0,1,1}, {1,1,0,0,1,0}, {0,1,1,1,0,0}, {1,0,1,0,0,0} }; //广度遍历 List lst=new ArrayList();//等待遍历 Set set=new HashSet();//保存已遍历的节点 lst.add(0);//先添加个0节点 while(true){ if(lst.isEmpty())break; int node=(Integer)lst.get(0); System.out.println(node); set.add(node); lst.remove(0); for(int i=0;i<a[node].length;i++){ //相连,未遍历,lst中不含有该节点(可能这个节点的孩子中存在下个节点的孩子) if(a[node][i]==1&&set.contains(i)==false&&lst.indexOf(i)==-1){ lst.add(i); } } } } }
更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索int
, 矩阵
, 稀疏矩阵
, color
, 节点
, 图的遍历
, 顶点
, param
, 稀疏表示 协作表示
, 稀疏矩阵 压缩存储
, 稀疏矩阵数组link
遍历表
邻接表深度优先遍历、邻接表的深度优先遍历、邻接表的广度优先遍历、邻接表广度优先遍历、邻接表遍历,以便于您获取更多的相关知识。