图状结构简称图,是另一种非线性结构,它比树形结构更复杂。树形结构中的结点是一对多的关系,结点间具有明显的层次和分支关系。每一层的结点可以和下一层的多个结点相关,但只能和上一层的一个结点相关。而图中的顶点(把图中的数据元素称为顶点)是多对多的关系,即顶点间的关系是任意的,图中任意两个顶点之间都可能相关。也就是说,图的顶点之间无明显的层次关系,这种关系在现实世界中大量存在。因此,图的应用相当广泛,在自然科学、社会科学和人文科学等许多领域都有着非常广泛的应用。

  1.1:图的基本概念

   1.1.1:图的定义

  图(Graph)是由非空的顶点(Vertex)集合和描述顶点之间的关系——边(Edge)或弧(Arc)的集合组成。其形式化定义为:

  G=(V,E)

  V={v i |v i ∈某个数据元素集合}
  E={(v i ,v j )|v i ,v j ∈V∧P(v i ,v j )}或E={<v i ,v j >|v i ,v j ∈V∧P(v i ,v j )}

  其中,G 表示图,V 是顶点的集合,E 是边或弧的集合。在集合 E 中,P(vi,vj)表示顶点 vi 和顶点 vj 之间有边或弧相连。下图给出了图的示例。

  【C#数据结构系列】图

  在图 (a)中,V={v 1 ,v 2 ,v 3 ,v 4 ,v 5 }E={(v 1 ,v 2 ),(v 1 ,v 3 ),(v 2 ,v 4 ),(v 2 ,v 5 ),(v 3 ,v 4 ),(v 4 ,v 5 )}

  在图 (b)中,V={v 1 ,v 2 ,v 3 ,v 4 ,v 5 }E={<v 1 ,v 2 >,<v 1 ,v 3 >,<v 2 ,v 3 >,<v 2 ,v 5 ><v 3 ,v 4 >,<v 4 ,v 1 >,<v 4 ,v 5 >}。

  注:无向边用小括号“()”表示,而有向边用尖括号“<>”表示。

  1.1.2:图的基本术语

  1、无向图:在一个图中,如果任意两个顶点v i 和v j 构成的偶对(v i ,v j )∈E是无序的,即顶点之间的连线没有方向,则该图称为无向图(Undirected Graph)。图 (a)是一个无向图。

  2、有向图:在一个图中,如果任意两个顶点v i 和v j 构成的偶对<v i ,v j >∈E是有序的,即顶点之间的连线有方向,则该图称为有向图(Directed Graph)。图(b)是一个有向图。

  3、边、弧、弧头、弧尾:无向图中两个顶点之间的连线称为边(Edge)边用顶点的无序偶对(v i ,v j )表示,称顶点v i 和顶点v j 互为邻接点(Adjacency Point),(v i ,v j )边依附与顶点v i 和顶点v j 。有向图中两个顶点之间的连线称为弧(Arc)弧用顶点的有序偶对<v i ,v j >表示有序偶对的第一个结点v i 称为始点(或弧尾),在图中不带箭头的一端;有序偶对的第二个结点v j 称为终点(或弧头),在图中带箭头的一端。

  4、无向完全图:在一个无向图中,如果任意两个顶点之间都有边相连,则称该图为无向完全图(Undirected Complete Graph)。可以证明,在一个含有 n 个顶点的无向完全图中,有 n(n-1)/2 条边。

  5、有向完全图:在一个有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图(Directed Complete Graph)。可以证明,在一个含有 n 个顶点的有向完全图中,有 n(n-1)条弧。

  6、顶点的度、入度、出度:在无向图中,顶点 v 的度(Degree)是指依附于顶点 v 的边数,通常记为 TD(v)。在有向图中,顶点的度等于顶点的入度(In Degree)与顶点的出度之和。顶点v的入度是指以该顶点v为弧头的弧的数目,记为ID(v);顶点 v 的出度(Out Degree)是指以该顶点 v 为弧尾的弧的数目,记为 OD(v)。所以,顶点 v 的度 TD(v)= ID(v)+ OD(v)。

  例如,在无向图 (a)中有:

  TD(v 1 )=2 TD(v 2 )=3 TD(v 3 )=2 TD(v 4 )=3 TD(v 5 )=2
  在有向图 (b)中有:
  ID(v 1 )=1 OD(v 1 )=2 TD(v 1 )=3
  ID(v 2 )=1 OD(v 2 )=2 TD(v 2 )=3
  ID(v 3 )=2 OD(v 3 )=1 TD(v 3 )=3
  ID(v 4 )=1 OD(v 4 )=2 TD(v 4 )=3
  ID(v 5 )=2 OD(v 5 )=0 TD(v 5 )=2

  7、权、网:有些图的边(或弧)附带有一些数据信息,这些数据信息称为边(或弧)的权(Weight)。在实际问题中,权可以表示某种含义。比如,在一个地方的交通图中,边上的权值表示该条线路的长度或等级。在一个工程进度图中,弧上的权值可以表示从前一个工程到后一个工程所需要的时间或其它代价等。(或弧)上带权的图称为网或网络(Network)。 下图是权图的示例图。

  【C#数据结构系列】图

  8、子图:设有两个图 G1=(V1,E1),G2=(V2,E2),如果 V1 是 V2 子集,E1 也是 E2 的子集,则称图 G1 是 G2 的子图(Subgraph)。下图是子图的示例图。

【C#数据结构系列】图

  9、路径、路径长度:在无向图G中,若存在一个顶点序列V p ,V i1 ,V i2 ,…,V im ,V q ,使得(V p ,V i1 ),(V i1 ,V i2 ),…,(V im ,V q )均属于E(G)。则称顶点V p 到V q 存在一条路径(Path)。若G为有向图,则路径也是有向的。它由E(G)中的弧<V p ,V i1 >,<V i1 ,V i2 >,…,<V im ,V q >组成。路径长度(Path Length)定义为路径上边或弧的数目。在图 (a)交通网络图中,从顶点A到顶点B存在 4 条路径,长度分别为1、2、2、4。在图 (b)施工进度图中,从顶点 1 到顶点 7 存在 2 条路径,长度分别为 2 和3。

  10、简单路径、回路、简单回路:若一条路径上顶点不重复出现,则称此路径为简单路径(Simple Path)。第一个顶点和最后一个顶点相同的路径称为回路(Cycle)或环。除第一个顶点和最后一个顶点相同其余顶点都不重复的回路称为简单回路(Simple Cycle),或者简单环。

  11、连通、连通图、连通分量:在无向图中,若两个顶点之间有路径,则称这两个顶点是连通的(Connect)。如果无向图 G 中任意两个顶点之间都是连通的,则称图 G 是连通图(Connected Graph)。连通分量(Connected Compenent)是无向图 G的极大连通子图。极大连通子图是一个图的连通子图,该子图不是该图的其它连通子图的子图。图 (a)G1和图(b)G2是连通图,图的连通分量的示例见下图所示。图 6.4(a)中的图 G 有两个连通分量。

  【C#数据结构系列】图

  12、强连通图、强连通分量:在有向图中,若图中任意两个顶点之间都存在从一个顶点到另一个顶点的路径,则称该有向图是强连通图(Strongly ConnectedGraph) 。 有 向 图 的 极 大 强 连 通 子 图 称 为 强 连 通 分 量 (Strongly ConnectedComponent)。极大强连通子图是一个有向图的强连通子图,该子图不是该图的其它强连通子图的子图。左图是强连通图,右图是强连通分量的示例图。图(a)中的有向图 G 有两个强连通分量。

【C#数据结构系列】图【C#数据结构系列】图

 

   13、生成树:所谓连通图 G 的生成树(Spanning Tree)是指 G 的包含其全部顶点的一个极小连通子图。所谓极小连通子图是指在包含所有顶点并且保证连通的前提下包含原图中最少的边。一棵具有 n 个顶点的连通图 G 的生成树有且仅有 n-1条边,如果少一条边就不是连通图,如果多一条边就一定有环。但是,有 n-1 条边的图不一定是生成树。图 6.7 就是图 6.3(a)的一棵生成树。

 【C#数据结构系列】图

  14、生成森林:在非连通图中,由每个连通分量都可得到一个极小连通子图,即一棵生成树。这些连通分量的生成树就组成了一个非连通图的生成森林(Spanning Forest)。

  1.1.3:图的基本操作

  图的基本操作用一个接口来表示,为表示图的基本操作,同时给出了顶点类的实现。由于顶点只保存自身信息,所以顶点类 Node<T>很简单,里面只有一个字段 data。

 

  顶点的类 Node<T>的实现如下所示。

 1 public class Node<T>
 2     {
 3         private T data; //数据域
 4         //构造器
 5         public Node(T v)
 6         {
 7             data = v;
 8         }
 9         //数据域属性
10         public T Data
11         {
12             get
13             {
14                 return data;
15             }
16             set
17             {
18                 data = value;
19             }
20         }
21     }
View Code

相关文章: