图的表示方法:
邻接矩阵法(太浪费空间,但确实把所有信息都表示了出来,计算度或者各种操作的话很方便,当然用无向图的对称性、只存放非0结点可以优化)
邻接表(算比较好的一种方法,但是对于有向图计算入度必须遍历,用逆邻接表、十字链表优化)
十字链表(和邻接表太类似)
遍历算法:
图是标准的多对多结构,因此不构成环并且不重复访问vertex需要一个标志数组visited,循环这个保证全部都访问,遍历过程中可以有DFS和BFS
DFS:递归方式,首先访问vertex,循环找邻接节点,找到并且该vertex没有被访问过,将顶点当成参数进入下一层。
BFS:需要堆栈配合,找到自己邻接的顶点如果没有被访问过则访问并将其入栈,然后用stack非空控制循环直到全部访问过。
还有一些计算连通分量个数、度的问题,就是遍历算法的应用。
代码(结构写的有点乱,回头看的时候可以优化下):
- package nuaa.ds;
- public class Graph {
- private String[] vertexes;//邻接矩阵法所
- private int[][] vr; //使用的成员变量
- private CreateGraph g;
- private VertexNode[] vertexNodes;//邻接表所使用的成员变量
- /**
- * 图的构成实在太多,写个标准无向图熟悉算法
- * 顶点ABCD(其中BC不连)彼此互连,EF彼此互连
- */
- public Graph(CreateGraph c){
- this.g = c;
- switch(c){
- case AdjacencyMatrix://邻接矩阵
- vertexes = new String[]{ "A","B","C","D","E","F"};//ABCDEF6个顶点
- vr = new int[6][6];
- vr[0] = new int[]{ 0,1,1,1,0,0};//邻接矩阵法表示边,相连值为1,不连值为0
- vr[1] = new int[]{ 1,0,0,1,0,0};//优点是所有信息全部显示出来
- vr[2] = new int[]{