文章目录
前言
1.什么是图?
图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的;其中,点通常称为顶点(vertex),而点到点之间的连线通常称之为边或者弧(edge)。通常记为G=(V,E)。
大概张这样:
2.图如何表示?
图的表示有两种方式:
- 邻接矩阵
- 邻接表
如何合理的使用这两种存储方式:
设 顶点个数 V、边的个数 E
那么从空间复杂度来说:邻接矩阵为O(V^2)、邻接表为O(V+E)
从上面两个空间复杂度可以得出:
对于边较少的图,明显采用邻接表较为合理。
3.如何创建一个邻接表
从上面的存储图可以得知,邻接表都是通过每个顶点,后面连接相关联的边信息。
Vertex.java
package com.kiger.graph;
/**
* @ClassName Vertex
* @Description 邻接表的顶点
* 该类借鉴于一种Bag的数据结构
* @Author zk_kiger
* @Date 2019/11/12 22:30
* @Version 1.0
*/
public class Vertex<T> {
// 存储顶点数据
private T data;
// 下一条边信息
private Edge first;
// 该顶点连顶点数
private int size;
public Vertex() {
}
// 使用链表的头插法将边结点的信息插入顶点后面
public void add(Edge item) {
if (first == null) {
first = item;
} else {
item.setNext(first);
first = item;
}
size++;
}
// 获得下标为index的元素
public int get(int index) {
if (index >= size)
return 0;
Edge cur = first;
while (index != 0) {
cur = cur.getNext();
--index;
}
return cur.getVertexIndex();
}
// 获取元素个数
public int size() {
return size;
}
// 判断是否为空
public boolean isEmpty() {
return (first == null);
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Edge getFirst() {
return first;
}
public void setFirst(Edge first) {
this.first = first;
}
@Override
public String toString() {
return "Vertex{" +
"data=" + data +
", first=" + first +
", size=" + size +
'}';
}
}
Edge.java
package com.kiger.graph;
/**
* @ClassName Edge
* @Description 边结点
* @Author zk_kiger
* @Date 2019/11/12 22:32
* @Version 1.0
*/
public class Edge {
// 存在边的顶点下标
private int vertexIndex;
// 与顶点之间的权值
private int weight;
// 相连的下一个边
private Edge next;
public Edge() {
}
public Edge(int vertexIndex, Edge next) {
this.vertexIndex = vertexIndex;
this.next = next;
}
public Edge(int vertexIndex, int weight, Edge next) {
this.vertexIndex = vertexIndex;
this.weight = weight;
this.next = next;
}
public int getVertexIn