一:什么是图
图是一种和树相像的数据结构,通常有一种固定的形状,这是由物理或抽象的问题来决定的
二:邻接
如果两个顶点被同一条边连接,就称这两个顶点是邻接的
1.邻接表
顶点 | 该顶点连接的其他顶点 |
---|---|
A | B->C->D |
B | A->C |
C | A->B |
D | A->E |
E | D |
2.邻接矩阵
A | B | C | D | E | |
---|---|---|---|---|---|
A | 1 | 1 | 1 | 1 | 0 |
B | 1 | 1 | 1 | 0 | 0 |
C | 1 | 1 | 1 | 0 | 0 |
D | 1 | 0 | 0 | 1 | 1 |
E | 0 | 0 | 0 | 1 | 1 |
注:1代表两个顶点可以连接,0代表两个顶点不可以连接,斜向代表相同顶点之间,可以使用1/0代表
三:路径
路径是从一个顶点到另一个顶点经过的边的序列
四:连通图和非连通图
至少有一条路径可以连接所有的顶点,那么就是连通图,否则就是非连通图
五:有向图和无向图
有向图: 有方向,只能从A->B,而不能从B->A
无向图:没有方向,可以从A->B,也可以 从B->A
六:带权图
在有些图中,边被赋予了一个权值,权值是一个数字,可以代表两个顶点之间的距离,或者是一个顶点到另一个顶点的时间等等.
七:代码实现
1.创建顶点类
//顶点类
public class Vertex {
//顶点名称
private char label;
public Vertex( char label){
this.label = label;
}
}
2.创建图类
//图
public class Graph {
//顶点数组
private Vertex[] vertexList;
//邻接矩阵,二维数组
private int[][] arr;
//顶点最大数量
private int maxSize;
//已添加顶点
private int vt;
public Graph(){
//初始化顶点数组
vertexList = new Vertex[maxSize];
//初始化邻接矩阵
arr = new int[maxSize][maxSize];
//初始化值
for (int i= 0;i<maxSize;i++){
for (int j= 0;j<maxSize;j++){
//代表所有的边都不相连
arr[i][j] = 0;
}
}
vt = 0;
}
//添加顶点
public void addVertex(char label){
//往顶点数组内添加顶点
vertexList[vt++] = new Vertex(label);
}
//添加边
public void addEdge(int start , int end){
//从 start 到 end 连通
arr[start][end] = 1;
//从 end 到 start 自然也连通
arr[end][start] = 1;
}
}
3.测试
public class Test {
public static void main(String[] args) {
//添加顶点
Graph graph = new Graph();
graph.addVertex('A');
graph.addVertex('B');
graph.addVertex('C');
//添加边
graph.addEdge(0,1);
graph.addEdge(0,2);
graph.addEdge(1,2);
}
}