图
图是由顶点的有穷非空集合和顶点之间边的的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合.
图的特征
- 线性表中我们把数据元素叫元素,树中将数据元素叫结点,在图中数据元 素,我们则称之为顶点(Vertex)。
- 线性表中可以没有数据元素,称为空表。树中可以没有结点,叫做空树。
- 线性表中,相邻的数据元素之间具有线性关系,树结构中,相邻两层的结 点具有层次关系,而图中,任意两个顶点之间都可能有关系,顶点之间的 逻辑关系用边来表示,边集可以是空的。
无向图
有向图
图的权
连通图
度
图的存储结构
邻接矩阵
带权邻接矩阵
邻接表
十字链表
深度优先遍历
广度优先遍历
以带权邻接矩阵为例
public class Graph {
//顶点的数量
private int vertexSize;
//一维数组
private int[] vertexs;
//二维数组
private int[][] matrix;
private int MAX_WEIGHT = 1000;
public Graph() {
this.vertexSize = 5;
matrix = new int[vertexSize][vertexSize];
vertexs = new int[5];
for (int i = 0; i < vertexSize; i++) {
vertexs[i] = i;
}
}
/**
* 获取两个顶点之间的权值
*/
public int getWeight(int v1, int v2) {
int weight = matrix[v1][v2];
return weight==0?0:(weight==MAX_WEIGHT?-1:weight);
}
/**
* 获得出度
*/
public int getOutDegree(int index) {
int degree = 0;
for (int i = 0; i < matrix[index].length; i++) {
int weight = matrix[index][i];
if (weight != 0 && weight != MAX_WEIGHT) {
degree++;
}
}
return degree;
}
public int[] getVertexs() {
return vertexs;
}
public void setVertexs(int[] vertexs) {
this.vertexs = vertexs;
}
@Test
public void test() {
Graph grace = new Graph();
int[] a1 = new int[]{0, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 6};
int[] a2 = new int[]{9, 0, 3, MAX_WEIGHT, MAX_WEIGHT};
int[] a3 = new int[]{2, MAX_WEIGHT, 0, 5, MAX_WEIGHT};
int[] a4 = new int[]{MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 0, 1};
int[] a5 = new int[]{MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, MAX_WEIGHT, 0};
grace.matrix[0] = a1;
grace.matrix[1] = a2;
grace.matrix[2] = a3;
grace.matrix[3] = a4;
grace.matrix[4] = a5;
int outDegree = grace.getOutDegree(1);
// System.out.println(outDegree);
System.out.println("权值"+grace.getWeight(0,4));
}
}