图
图:和树相似,有一个固定的形状,由物理或抽象的问题来决定的
邻接:如果两个顶点被同一条边连接
路径:从一个顶点到另一个顶点经过的序列
连通图和非连通图:至少有一条路径可以连接所有的顶点,则为连通图,否则为非连通图
有向图无向图:边是有方向的为有向图A->B,B!->A
边是无方向的为无向图A<——>B
带权图:边被赋予了权值,权值为一个数字,可以代表两个顶点的物理距离,或者一个顶点到另一个顶点的时间等
下图是一个有向图:
用两种方式表示
1、邻接表表示
2、邻接矩阵表示
A | B | C | D | E | F | |
A | 1 | 1 | 1 | 1 | 1 | 1 |
B | 1 | 1 | 1 | 0 | 0 | 0 |
C | 1 | 1 | 1 | 0 | 0 | 0 |
D | 1 | 0 | 1 | 1 | 1 | 0 |
E | 1 | 0 | 1 | 0 | 1 | 1 |
F | 1 | 0 | 0 | 1 | 1 |
对角线是自己连接自己,肯定可以连接,可以写1或0,其余位置,可以连接写1,无法连接为0
定义顶点类
/**
* 顶点类
* @author Administrator
*
*/
public class Vertex {
private char label;
public Vertex(char label) {
this.label = label;
}
}
定义图
/**
* 图
* @author Administrator
*
*/
public class Graph {
//顶点数组
private Vertex[] vertexList;
//邻接矩阵
private int[][] adjMat;
//顶点的最大数目
private int maxSize;
//当前顶点
private int nVertex;
public Graph() {
vertexList = new Vertex[maxSize];
adjMat = new int[maxSize][maxSize];
for(int i = 0; i < maxSize; i++) {
for(int j = 0; j < maxSize; j++) {
adjMat[i][j] = 0;
}
}
nVertex = 0;
}
/**
* 添加顶点
*/
public void addVertex(char label) {
vertexList[nVertex++] = new Vertex(label);
}
/**
* 添加边
*/
public void addEdge(int start,int end) {
adjMat[start][end] = 1;
adjMat[end][start] = 1;
}
}
进行测试
public class TestGraph {
public static void main(String[] args) {
Graph g = new Graph();
g.addVertex('A');
g.addVertex('B');
g.addVertex('C');
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
}
}