第八章 图.ppt
《第八章 图.ppt》由会员分享,可在线阅读,更多相关《第八章 图.ppt(133页珍藏版)》请在麦多课文档分享上搜索。
1、第八章 图,图的基本概念 图的存储结构 图的遍历与连通性 最小生成树 最短路径 活动网络,1,图的基本概念,图定义 图是由顶点(vertex)集合以及顶点之间的关系集合组成的一种数据结构:G( V, E ) 其中 V = x | x 某个数据对象 是顶点的有穷非空集合;E = (x, y) | x, y V 或 E = | x, y V & Path (x, y)是顶点之间关系的有穷集合,也叫做边(edge)集合。Path (x, y)表示从 x 到 y 的一条单向通路, 它是有方向的。,2,有向图与无向图 在有向图中,顶点对 是有序的。在无向图中,顶点对(x, y)是无序的。 完全图 若有
2、n 个顶点的无向图有 n(n-1)/2 条边, 则此图为无向完全图。若有 n 个顶点的有向图有n(n-1) 条边, 则此图为有向完全图。,3,0,0,0,0,1,1,1,1,2,2,2,2,6,5,4,3,3,邻接顶点 如果 (u, v) 是 E(G) 中的一条边,则称 u 与 v 互为邻接顶点。 子图 设有两个图G(V, E) 和G(V, E)。若V V 且EE, 则称图G是图G的子图。权或权重(weight) 在某些图中,边具有与它相关的数值, 称为权重。带权图也叫作网络(network)。,4,子图,顶点的度 (degree) 一个顶点v的度是与它相关联的边的条数, 记作deg(v)。在
3、有向图中, 顶点 v 的入度是以 v 为终点的有向边的条数, 记作 indeg(v); 顶点 v 的出度是以 v 为始点的有向边的条数, 记作 outdeg(v)。在有向图中, 顶点的度等于该顶点的入度与出度之和。路径 在图 G(V, E) 中, 若从顶点 vi 出发, 沿一些边经过若干顶点 vp1, vp2, , vpm,到达顶点vj,则称顶点序列 (vi , vp1 , vp2 , . , vpm , vj) 为从顶点vi 到顶点 vj 的一条路径。它经过的边(vi, vp1)、(vp1, vp2)、.、(vpm, vj) 都是来自于E的边。,5,路径长度 非带权图的路径长度是指此路径上边
4、的条数。带权图的路径长度是指路径上各边的权值之和。简单路径 若路径上各顶点 v1, v2, ., vm 均不互相重复, 则称这样的路径为简单路径。回路 若路径上第一个顶点 v1 与最后一个顶点vm 重合, 则称这样的路径为回路或环。,6,0,1,2,3,0,1,2,3,0,1,2,3,连通图与连通分量 在无向图中, 若从顶点v1到顶点v2有路径, 则称顶点v1与v2是连通的。如果图中任意一对顶点都是连通的, 则称此图是连通图。非连通图的极大连通子图叫做连通分量。强连通图与强连通分量 在有向图中, 若对于每一对顶点vi和vj, 都存在一条从vi到vj和从vj到vi的路径, 则称此图是强连通图。非
5、强连通图的极大强连通子图叫做强连通分量。生成树(spanning tree) 一个无向连通图的生成树是其极小连通子图,在 n 个顶点的情形下,有 n-1 条边。若是有向图,则可能得到它的由若干有向树组成的生成森林。,7,图的抽象数据类型,class Graph /对象: 由一个非空顶点集合和一个边集合构成 /每条边由一个顶点对来表示。 public:Graph(); /建立一个空的图void insertVertex (const T/在图中删除顶点v和所有关联到它的边,8,void removeEdge (int v1, int v2);/在图中删去边(v1,v2)bool IsEmpty(
6、);/若图中没有顶点, 则返回true, 否则返回falseT getWeight (int v1, int v2);/函数返回边 (v1,v2) 的权值int getFirstNeighbor (int v);/给出顶点 v 第一个邻接顶点的位置int getNextNeighbor (int v, int w);/给出顶点 v 的某邻接顶点 w 的下一个邻接顶点 ;,9,图的存储表示,图的模板基类 在模板类定义中的数据类型参数表 中,T是顶点数据的类型,E是边上所附数据的类型。这个模板基类是按照最复杂的情况(即带权无向图)来定义的,如果需要使用非带权图,可将数据类型参数表 改为 。如果使用
7、的是有向图,也可以对程序做相应的改动。,10,图的模板基类,const int maxWeight = ; /无穷大的值(=) const int DefaultVertices = 30; /最大顶点数(=n) template class Graph /图的类定义 protected:int maxVertices; /图中最大顶点数int numEdges; /当前边数int numVertices; /当前顶点数virtual int getVertexPos (T vertex); /给出顶点vertex在图中位置 public:,11,Graph (int sz = Default
8、Vertices); /构造函数Graph(); /析构函数bool GraphEmpty () const /判图空否 return numEdges = 0; int NumberOfVertices () return numVertices; /返回当前顶点数int NumberOfEdges () return numEdges; /返回当前边数virtual T getValue (int i); /取顶点 i 的值virtual E getWeight (int v1, int v2); /取边上权值virtual int getFirstNeighbor (int v);/取顶
9、点 v 的第一个邻接顶点,12,virtual int getNextNeighbor (int v, int w);/取邻接顶点 w 的下一邻接顶点virtual bool insertVertex (const T vertex);/插入一个顶点vertexvirtual bool insertEdge (int v1, int v2, E cost);/插入边(v1,v2), 权为costvirtual bool removeVertex (int v); /删去顶点 v 和所有与相关联边virtual bool removeEdge (int v1, int v2); /在图中删去边(
10、v1,v2) ;所有虚函数都与具体存储表示相关。,13,邻接矩阵 (Adjacency Matrix)表示,在图的邻接矩阵表示中,有一个记录各个顶点信息的顶点表,还有一个表示各个顶点之间关系的邻接矩阵。设图 A = (V, E) 是一个有 n 个顶点的图, 图的邻接矩阵是一个二维数组 A.Edgenn,定义:,14,15,在有向图中, 统计第 i 行 1 的个数可得顶点 i 的出度,统计第 j 列 1 的个数可得顶点 j 的入度。在无向图中, 统计第 i 行 (列) 1 的个数可得顶点i 的度。,16,无向图的邻接矩阵是对称的;有向图的邻接矩阵可能是不对称的。,17,网络(带权图)的邻接矩阵,
11、template class Graphmtx : public Graph friend istream,18,用邻接矩阵表示的图的类定义,public: Graphmtx (int sz = DefaultVertices); /构造函数Graphmtx () /析构函数 delete VerticesList; for (i = 0; i = 0 ,19,int getFirstNeighbor (int v);/取顶点 v 的第一个邻接顶点int getNextNeighbor (int v, int w); /取 v 的邻接顶点 w 的下一邻接顶点bool insertVertex
12、(const T vertex); /插入顶点vertexbool insertEdge (int v1, int v2, E cost);/插入边(v1, v2),权值为costbool removeVertex (int v);/删去顶点 v 和所有与它相关联的边bool removeEdge (int v1, int v2);/在图中删去边(v1,v2) ;,20,template Graphmtx:Graphmtx (int sz) /构造函数maxVertices = sz; numVertices = 0; numEdges = 0;int i, j;VerticesList =
13、new TmaxVertices; /创建顶点表Edge = (E *) new E*maxVertices;for (i = 0; i maxVertices; i+)Edgei = new EmaxVertices; /邻接矩阵 for (i = 0; i maxVertices; i+) /矩阵初始化for (j = 0; j maxVertices; j+)Edgeij = (i = j) ? 0 : maxWeight; ;,21,template int Graphmtx:getFirstNeighbor (int v) /给出顶点位置为v的第一个邻接顶点的位置, /如果找不到,
14、则函数返回-1if (v != -1) for (int col = 0; col 0 ,22,template int Graphmtx:getNextNeighbor (int v, int w) /给出顶点 v 的某邻接顶点 w 的下一个邻接顶点 if (v != -1 ,23,邻接表 (Adjacency List),以邻接矩阵表示图,当边数远远小于n2 的时候,大量元素是maxWeight,会造成空间浪费。邻接表是邻接矩阵的改进形式。为此需要把邻接矩阵的各行分别组织为一个单链表。在邻接表中,同一个顶点发出的边链接在同一个边链表中,每一个链表结点代表一条边(边结点),结点中有另一顶点的
15、标识 dest 和指针 link。对于带权图,边结点中还要保存该边的权值cost。顶点表的第 i 个顶点中保存该顶点的数据,以及它对应边链表的头指针adj。,24,无向图的邻接表,统计某顶点对应边链表中结点个数,可得该顶点的度。 某条边(vi, vj)在邻接表中有两个边结点,分别在第 i 个顶点和第 j 个顶点对应的边链表中。,25,有向图的邻接表和逆邻接表,26,网络 (带权图) 的邻接表,统计出边表中结点个数,得到该顶点的出度; 统计入边表中结点个数,得到该顶点的入度。,27,用邻接表表示的图的类定义,template struct Edge /边结点的定义int dest; /边的另一顶
16、点位置E cost; /边上的权值Edge *link; /下一条边链指针Edge () /构造函数Edge (int num, E c) /构造函数: dest (num), cost (c), link (NULL) bool operator != (Edge,28,template struct Vertex /顶点的定义T data; /顶点的名字Edge *adj; /边链表的头指针 ;template class Graphlnk : public Graph /图的类定义 friend istream /输出,29,private:Vertex *NodeTable;/顶点表
17、(各边链表的头结点)int getVertexPos (const T vertex) /给出顶点vertex在图中的位置for (int i = 0; i numVertices; i+)if (NodeTablei.data = vertex) return i;return -1; public:Graphlnk (int sz = DefaultVertices); /构造函数Graphlnk(); /析构函数,30,T getValue (int i) /取顶点 i 的值return (i = 0 ,31,template Graphlnk:Graphlnk (int sz) /构造
18、函数:建立一个空的邻接表maxVertices = sz;numVertices = 0; numEdges = 0;NodeTable = new VertexmaxVertices; /创建顶点表数组if (NodeTable = NULL) cerr “存储分配错!“ endl; exit(1); for (int i = 0; i maxVertices; i+) NodeTablei.adj = NULL; ;,32,template Graphlnk:Graphlnk() /析构函数:删除一个邻接表for (int i = 0; i *p = NodeTablei.adj;whil
19、e (p != NULL) NodeTablei.adj = p-link;delete p; p = NodeTablei.adj; delete NodeTable; /删除顶点表数组 ;,33,template int Graphlnk:getFirstNeighbor (int v) /给出顶点位置为 v 的第一个邻接顶点的位置, /如果找不到, 则函数返回-1if (v != -1) /顶点v存在Edge *p = NodeTablev.adj; /对应边链表第一个边结点if (p != NULL) return p-dest; /存在, 返回第一个邻接顶点return -1; /第
20、一个邻接顶点不存在 ;,34,template int Graphlnk:getNextNeighbor (int v, int w) /给出顶点v的邻接顶点w的下一个邻接顶点的位置, /若没有下一个邻接顶点, 则函数返回-1if (v != -1) /顶点v存在Edge *p = NodeTablev.adj;while (p != NULL ,35,邻接矩阵与邻接表对比,空间时间,邻接多重表 (Adjacency Multilist),无向图的邻接表表示中,每条边被存储了两遍,既浪费了空间,又造成为边做标记等有关边的处理的不方便在邻接多重表中, 每一条边只有一个边结点。为有关边的处理提供了
21、方便。,37,无向图,边结点的结构其中, mark 是记录是否处理过的标记; vertex1和vertex2是该边两顶点位置。path1域是链接指针, 指向下一条依附顶点vertex1的边;path2 是指向下一条依附顶点vertex2的边链接指针。 需要时还可设置一个存放与该边相关的权值的域 cost。,38,顶点结点的结构存储顶点信息的结点表以顺序表方式组织, 每个顶点结点有两个数据成员:其中,data 存放与该顶点相关的信息,firstout 是指向依附于该顶点的第一条边的指针。在邻接多重表中, 所有依附同一个顶点的边都链接在同一个单链表中。,39,无向图,邻接多重表的结构,从顶点 i
22、出发, 可以循链找到所有依附于该顶点的边,也可以找到它的所有邻接顶点。,40,无向图,在用邻接表表示有向图时, 有时需要同时使用邻接表和逆邻接表。用有向图的邻接多重表(十字链表)可把两个表结合起来表示。 边结点的结构其中,mark是处理标记;vertex1和vertex2指明该有向边始顶点和终顶点的位置。path1是链接指针,指向与该边有同一始顶点的下一条边(出边表);path2也是链接指针,指向与该边有同一终顶点的下一条边(入边表)。需要时还可有权值域cost。,41,有向图,顶点结点的结构每个顶点有一个结点,它相当于出边表和入边表的表头结点:其中,数据成员data存放与该顶点相关的信息,指
23、针firstout指向以该顶点为始顶点的出边表的第一条边, firstin 指向以该顶点为终顶点的入边表的第一条边。,42,有向图,43,有向图,图的遍历与连通性,从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历 (Graph Traversal)。图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。,44,为了避免重复访问,可设置一个标志顶点是否被访问过的辅助数组 visited 。辅助数组visited 的初始状态为 0, 在图的遍历过程中, 一旦某一个顶点 i 被访问, 就
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八 PPT
