图一般有两种实现方式,一种是邻接矩阵,一种是邻接表。这里为大家带来的是邻接矩阵实现图。
这里重点说下图的遍历的两种算法思路:
深度遍历:
深度遍历类似于树的前序遍历。
1、访问顶点v;
2、从v的未被访问的邻接点中选取一个顶点w,从w出发进行深度遍历;
3、重复上述两步,直到所有和v有路径相通的顶点都被访问到;
伪代码:
1、访问顶点v,state[v]=1;
2、w=顶点v的第一个邻接点;
3、while(w存在)
3.1、if(w未被访问)从顶点出发递归执行该算法;
3.2、w=顶点v的下一个邻接点;
广度优先遍历( breadth-first traverse)类似于树的层序遍历 思路为:
(1) 访问顶点v;
(2) 依次访问v 的各个未被访问的邻接点v1,v2,v3,..vk;
(3) 分别从V,V2,..,Vk 出发依次访问到他们没有被访问的邻接点,并使”先被访问顶点的邻接点”先于“后被访问顶点的邻接点”被访问。直到图中所有与顶点v有路径相通的顶点都被访问到。
1.初始化队列Q;
2.访问顶点v; state [v]=1; 顶点v人队列Q;
3.while (队列Q非空)
3.1 v=队列Q的队头元素出队;
3.2 w=顶点v的第一个邻接点;3.3while (w存在)
3.3.1 如果w 未被访问,则访问顶点w; 则访问顶点w;state[w]=1;顶点w入队列Q;3.3.2 w=顶点v的下一个邻接点;
代码如下:
public class Graph {
/**
* 图的顶点数
*/
private int vertexSize = 0;
/**
* 图的邻接矩阵
*/
private int[][] matrix = null;
/**
* 顶点数组
*/
private int[] vertex = null;
/**
* 代表两点之间无边
*/
private static final int MAX_SIZE = 1000;
/**
* 每个点被访问的状态 0为没有访问,1为被访问
*/
private int[] state = null;
/**
* 队,用于广度优先遍历
*/
private LinkedList<Integer> queue = new LinkedList<Integer>();
/**
* 求顶点
*
* @return
*/
public int getVertex() {
return vertexSize;
}
public Graph(int size, int[]... number) {
this.vertexSize = size;
matrix = new int[size][size];
vertex = new int[size];
//初始化数组
for