一、图的表示
要表示一个图G=<V,E>,有两种标准方法,即邻接表和邻接矩阵。这两种表示法既可用于有向图,也可用于无向图。通常采用邻接表表示法,因为用这种方法表示稀疏图(图中边数远比点个数要少)比较紧凑。但当遇到稠密图(|E|接近于|V|^2)或必须很快判断两个给定顶点是否存在连接边时,通常采用邻接矩阵形式。
图G=<V,E>的邻接表表示是由一个包含|V|个列表的数组Adj所组成,其中每个列表对应于V中的一个顶点。对于每一个u∈V,邻接表Adj[u]包含所有满足条件(u,v)∈E的顶点v。亦即,Adj[u]包含图G中所有和顶点u相邻的顶点。每个邻接表中的顶点一般以任意顺序存储。
如果G是一个有向图,则所有;邻接表的长度之和为|E|,这是因为一条形如(u,v)的边是通过让v出现在Adj[u]中来表示的。如果G是一个无向图,则所有邻接表的长度之和为2|E|,因为如果(u,v)是一条无向边,那么u会出现在v的邻接表中,反之亦然。邻接表需要的存储空间为O(V+E)。
邻接表稍作变动,即可用来表示加权图,即每条边都有着相应权值的图,权值通常由加权函数w:E→R给出。例如,设G=<V,E>是一个加权函数为w的加权图。对没一条边(u,v)∈E,权值w(u,v)和顶点v一起存储在u的邻接表中。
邻接表C/C++实现:
#include <iostream>
using namespace std;
#define maxn 100
int n, m; //图的顶点个数和边的条数
struct arcnode //边结点
{
int vertex; //与表头结点相邻的结点编号
int