1.27k likes | 1.51k Views
第 7 章 图. 概述. 图( Graph) 是一种复杂的非线性结构。在人工智能、工程、数学、物理、化学、生物和计算机科学等领域中,图结构有着广泛的应用。 本章先介绍图的概念,再介绍图的存储方法及有关图的算法。. 7.1 图的概念. 图的二元组定义 有向图和无向图. 图的二元组定义.
E N D
概述 • 图(Graph)是一种复杂的非线性结构。在人工智能、工程、数学、物理、化学、生物和计算机科学等领域中,图结构有着广泛的应用。 本章先介绍图的概念,再介绍图的存储方法及有关图的算法。
7.1 图的概念 • 图的二元组定义 • 有向图和无向图
图的二元组定义 • 图G由两个集合V和E组成,记为:G=(V,E)其中:V是顶点的有穷非空集合,E是V中顶点偶对(称为边)的有穷集。 通常,也将图G的顶点集和边集分别记为V(G)和E(G)。E(G)可以是空集。若E(G)为空,则图G只有顶点而没有边。
1.有向图 • 若图G中的每条边都是有方向的,则称G为有向图(Digraph)。(1)有向边的表示 在有向图中,一条有向边是由两个顶点组成的有序对,有序对通常用尖括号表示。有向边也称为弧(Arc),边的始点称为弧尾(Tail),终点称为弧头(Head)。 【例】<vi,vj>表示一条有向边,vi是边的始点(起点),vj是边的终点。因此,<vi,vj>和<vj,vi>是两条不同的有向边。
(2)有向图的表示 下面(a)图中G1是一个有向图。图中边的方向是用从始点指向终点的箭头表示的,该图的顶点集和边集分别为:V(G1)={v1,v2,v3} E(G1)={<v1,v2>,<v2,v1>,<v2,v3>}
2.无向图 • 若图G中的每条边都是没有方向的,则称G为无向图(Undigraph)。(1)无向边的表示 无向图中的边均是顶点的无序对,无序对通常用圆括号表示。
示例 • 【例】下面(b)图中的G2和(c)图中的G3均是无向图,它们的顶点集和边集分别为:V(G2)={v1,v2,v3,v4} E(G2)={(vl,v2),(v1,v3),(v1,v4),(v2,v3),(v2,v4),(v3,v4)}
无向图示例 • V(G3)={v1,v2,v3,v4,v5,v6,v7} E(G3)={(v1,v2),(vl,v3),(v2,v4),(v2,v5),(v3,v6),(v3,v7)}
注意: • 在以下讨论中,不考虑顶点到其自身的边。即若(v1,v2)或<vl,v2>是E(G)中的一条边,则要求v1≠v2。此外,不允许一条边在图中重复出现,即只讨论简单的图。
完全图 • 无向图的完全图:每二个顶点之间都有边相连:边数=n(n-1)/2,n为顶点个数 • 有向图的完全图:边数=n(n-1),n是顶点个数。
3.图G的顶点数n和边数e的关系 • (1)若G是无向图,则0≤e≤n(n-1)/2恰有n(n-1)/2条边的无向图称无向完全图(Undireet-ed Complete Graph)(2)若G是有向图,则0≤e≤n(n-1)。恰有n(n-1)条边的有向图称为有向完全图(Directed Complete Graph)。
1.无向边和顶点关系 • 若(vi,vj)是一条无向边,则称顶点vi和vj互为邻接点(Adjacent),或称vi和vj相邻接;并称(vi,vj)依附或关联(Incident)于顶点vi和vj,或称(vi,vj)与顶点vi和vj相关联。【例】下图G2中: ① 与顶点v1相邻接的顶点是v2,v3和v4 ② 关联于顶点v2的边是(v1,v2),(v2,v3)和(v2,v4)
2.有向边和顶点关系 • 若<vi,vj>是一条有向边,则称顶点vi邻接到vj,顶点vi邻接于顶点vj;并称边<vi,vj>关联于vi和vj或称<vi,vj>与顶点vi和vj相关联【例】在下图G1中,关联于顶点v2的弧是<v1,v2>,<v2,v1>和<v2,v3>。
n个顶点的完全有向图,它的入度为多少?出度为多少?n(n-1)n个顶点的完全有向图,它的入度为多少?出度为多少?n(n-1)
3.顶点的度(Degree) • (1)无向图中顶点v的度(Degree)无向图中顶点v的度(Degree)是关联于该顶点的边的数目,记为D(v)。【例】上图G2中顶点v1的度为3
有向图的入度和出度 • (2)有向图顶点v的入度(InDegree)有向图中,以顶点v为终点的边的数目称为v的入度(Indegree),记为ID(v)。【例】上图G1中顶点v2的人度为l(3)有向图顶点v的出度(Outdegree)有向图中,以顶点v为始点的边的数目,称为v的出度(Outdegree),记为OD(v)【例】上图G1中顶点v2的出度为2
注意: • ①有向图中,顶点v的度定义为该顶点的入度和出度之和,即D(v)=ID(v)+OD(v)。
e与n之间的关系 • ②无论有向图还是无向图,顶点数n、边数e和度数之间有如下关系:
子图 • 设G=(V,E)是一个图,若V'是V的子集,E'是E的子集,且E'中的边所关联的顶点均在V'中,则G'=(V',E')也是一个图,并称其为G的子图(Subgraph)。
注意: • 设V'={v1,v2,v3},E'={(vl,v2),(v2,v4)},显然,V'属于V(G2),E'属于E(G2),但因为E'中序偶对(v2,v4)所关联的顶点v4不在V'中,所以(V',E')不是图,也就不可能是G2的子图。
路径 • 路径(Path)1.无向图的路径 在无向图G中,若存在一个顶点序列vp,vi1,vi2,…,vim,vq,使得(vp,vi1),(vi1,vi2),…,(vim,vq)均属于E(G),则称顶点vp到vq存在一条路径(Path)。 • 简单路径: • 2.有向图的路径 在有向图G中,路径也是有向的,它由E(G)中的有向边<vp,vi1>,<vi1,vi2>,…,<vim,vq>组成。3.路径长度 路径长度定义为该路径上边的数目。
5.简单回路或简单环(Cycle) • 起点和终点相同(vp=vq)的简单路径称为简单回路或简单环(Cycle)。【例】图G2中,顶点序列v1,v2,v4,v1是一个长度为3的简单环【例】有向图G1中,顶点序列v1,v2,v1是一长度为2的有向简单环。
6.有根图和图的根 • 在一个有向图中,若存在一个顶点v,从该顶点有路径可以到达图中其它所有顶点,则称此有向图为有根图,v称作图的根。
1.顶点间的连通性 • 在无向图G中,若从顶点vi到顶点vj有路径(当然从vj到vi也一定有路径),则称vi和vj是连通的。
2.连通图 • 若V(G)中任意两个不同的顶点vi和vj都连通(即有路径),则称G为连通图(Con-nected Graph)。【例】图G2,和G3是连通图。
3.连通分量 无向图G的极大连通子图称为G的连通分量(Connected Component)。注意: ① 任何连通图的连通分量只有一个,即是其自身 ② 非连通的无向图有多个连通分量。 【例】下图中的G4是非连通图,它有两个连通分量H1和H2。
强连通图和强连通分量 • 1.强连通图 有向图G中,若对于V(G)中任意两个不同的顶点vi和vj,都存在从vi到vj以及从vj到vi的路径,则称G是强连通图。2.强连通分量 有向图的极大强连通子图称为G的强连通分量。注意: ① 强连通图只有一个强连通分量,即是其自身。 ② 非强连通的有向图有多个强连分量。
例】下图中的G1不是强连通图,因为v3到v2没有路径,但它有两个强连通分量,如右图所示。例】下图中的G1不是强连通图,因为v3到v2没有路径,但它有两个强连通分量,如右图所示。
网络(Network) • 若将图的每条边都赋上一个权,则称这种带权图为网络(Network)。注意:权是表示两个顶点之间的距离、耗费等具有某种意义的数。【例】下图就是一个网络的例子。
7.2图的存储结构 • 图的存储表示方法很多,这里介绍两种最常用的方法。至于具体选择哪一种表示法,主要取决于具体的应用和欲施加的操作。 为了适合用C语言描述,以下假定顶点序号从0开始,即图G的顶点集的一般形式是V(G)={v0,v1,…,Vn-1}。
图的邻接矩阵表示法 • 1.图的邻接矩阵表示法 在图的邻接矩阵表示法中: ① 用邻接矩阵表示顶点间的相邻关系 ② 用一个顺序表来存储顶点信息2.图的邻接矩阵(Adacency Matrix)设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下性质的n阶方阵.
例 • 例】下图中无向图G5和有向图G6的邻接矩阵分别为Al和A2。
无向图的邻接矩阵 • 是对称矩阵 • 每条边在矩阵中出现2次 • 每和之和和每列之和相等,和代表顶点的度 • 把矩阵的各元素求和/2,边数 • 一个优点. A[2][3]==0 • 缺点:插入一个顶点,删除一个顶点,比较麻烦
有向图的邻接矩阵 • 一般情况,它不是对称,如果有向图的邻接矩阵是对称的话?一个完全有向图。 • 每行之代表出度,每列之和代表入度。
.网络的邻接矩 • 若G是网络,则邻接矩阵可定义为:
说明 • 其中:wij表示边上的权值; ∞表示一个计算机允许的、大于所有边上权值的数。
4.图的邻接矩阵存储结构形式说明 • #define MaxVertexNum l00 //最大顶点数,应由用户定义typedef char VertexType; //顶点类型应由用户定义typedef int EdgeType; //边上的权值类型应由用户定义typedef struct{ VextexType vexs[MaxVertexNum]; //顶点表EdgeType edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看作边表int n,e; //图中当前的顶点数和边数 }MGragh;
注意: ① 在简单应用中,可直接用二维数组作为图的邻接矩阵(顶点表及顶点数等均可省略)。 ② 当邻接矩阵中的元素仅表示相应的边是否存在时,EdgeTyPe可定义为值为0和1的枚举类型。 ③ 无向图的邻接矩阵是对称矩阵,对规模特大的邻接矩阵可压缩存储。 ④ 邻接矩阵表示法的空间复杂度S(n)=0(n2)。
5.建立无向网络的算法。 void CreateMGraph(MGraph *G) {//建立无向网的邻接矩阵表示int i,j,k,w; scanf(“%d%d”,&G->n,&G->e); //输入顶点数和边数for(i=0;i<G->n;i++) //读人顶点信息,建立顶点表G->vexs[i]=getchar(); for(i=0;i<G->n;i++) for(j=0;j<G->n;j++) G->edges[i][j]=0; //邻接矩阵初始化for(k=0;k<G->e;k++) {//读入e条边,建立邻接矩阵scanf("%d%d%d",&i,&j,&w); //输入边(vi,vj)上的权w G->edges[i][j]=w; G->edges[j][i]=w; } }//CreateMGraph
思考题 • 有向图的邻接矩阵如何建立?
练习 • 如果用邻接矩阵表示有向图,写一个算法求各个顶点的入度和出度 • void GraphDegree(MGraph G, int Indegree[MaxVexNum],int OutDegree[MaxVexNum]) • { • }
图的邻接表表示法 • 图的邻接表表示法类似于树的孩子链表表示法。对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头结点的单链表,这个单链表就称为顶点vi的邻接表(Adjacency List)。