一. 图的介绍
说起图这个词,很多人可能首先会想到的就是图片,地图……等,但这里所说的图是一个抽象的概念。
定义:图是由一组顶点和一组能将两个顶点相连的边组成的。
图论一直以来都是数学领域的一个重要分支,但在计算机科学领域的应用中,基于图论的由一系列结点和边的模型起到了非常重要的作用,图的算法能够解决实际生活中许多比较复杂的问题,例如我们的地图、电路、社会中人与人之间的关系网已级计算机网络等无法通过一般的数据结构来描述的。所以它也是许多高级算法的基石,直到现在图论算法的研究一直在进行,因为仍有许多领域无法解决的问题。这里就总结一些图的基础算法。
二. 图的表示
图的分类有很多,按方向可分为有向图和无向图,按密度可分为稀疏图和稠密图。
而对于稀疏图一般的表示方法就是邻接表,而对于稠密图一般的表示就是邻接矩阵。这里对于有向性我们可以用一个简单的布尔类型的变量来表示,然后用int型的变量v、e分别表示顶点和边。
首先是稀疏图的表示,看看如下代码
// 稀疏图 - 邻接表
public class SparseGraph {
private int v; // 节点数
private int e; // 边数
private boolean directed; // 是否为有向图
private Vector<Integer>[] g; // 图的具体数据
// 构造函数
public SparseGraph( int n , boolean directed ){
assert n >= 0;
this.v = v;
this.e = e; // 初始化没有任何边
this.directed = directed;
// g初始化为n个空的vector, 表示每一个g[i]都为空, 即没有任和边
g = (Vector<Integer>[])new Vector[n];