第八章-图-数据结构(用面向对象的方法与C-语言描述)(第2版)课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第八章-图-数据结构(用面向对象的方法与C-语言描述)(第2版)课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八 数据结构 面向 对象 方法 语言 描述 课件
- 资源描述:
-
1、1 1第八章 图清华大学计算机系清华大学计算机系殷人昆殷人昆 王王 宏宏146-146-2 2n图的基本概念图的基本概念n图的存储表示图的存储表示n图的遍历与连通性图的遍历与连通性 n最小生成树最小生成树n最短路径最短路径 n活动网络活动网络第八章第八章 图图146-146-3 3图的基本概念图的基本概念n图定义图定义 图是由顶点集合图是由顶点集合(vertex)及顶点间的及顶点间的关系集合组成的一种数据结构:关系集合组成的一种数据结构:Graph(V,E)其中其中 V=x|x 某个数据对象某个数据对象 是顶点的有穷非空集合;是顶点的有穷非空集合;E=(x,y)|x,y V 或或 E=|x,y
2、 V&Path(x,y)是顶点之间关系的有穷集合,也叫做边是顶点之间关系的有穷集合,也叫做边(edge)集合。集合。Path(x,y)表示从表示从 x 到到 y 的一条单向通的一条单向通路路,它是有方向的。它是有方向的。146-146-4 4 n有向图与无向图有向图与无向图 在有向图中,顶点对在有向图中,顶点对 是有序的。在无向图中,顶点对是有序的。在无向图中,顶点对(x,y)是无序是无序的。的。n完全图完全图 若有若有 n 个顶点的无向图有个顶点的无向图有 n(n-1)/2 条条边边,则此图为完全无向图。有则此图为完全无向图。有 n 个顶点的有向个顶点的有向图有图有n(n-1)条边条边,则此
3、图为完全有向图。则此图为完全有向图。00001111222265433146-146-5 5 n邻接顶点邻接顶点 如果如果(u,v)是是 E(G)中的一条边,中的一条边,则称则称 u 与与 v 互为邻接顶点互为邻接顶点。n子图子图 设有两个图设有两个图G(V,E)和和G(V,E)。若若V V 且且E E,则称图则称图G是图是图G的子图。的子图。n权权 某些图的边具有与它相关的数某些图的边具有与它相关的数,称之为权。称之为权。这种带权图叫做网络。这种带权图叫做网络。子图子图01230130123023146-146-6 6n顶点的度顶点的度 一个顶点一个顶点v的度是与它相关联的边的度是与它相关联
4、的边的条数。记作的条数。记作TD(v)。在有向图中。在有向图中,顶点的度顶点的度等于该顶点的入度与出度之和。等于该顶点的入度与出度之和。n顶点顶点 v 的入度的入度是以是以 v 为终点的有向边的条数为终点的有向边的条数,记作记作 ID(v);顶点顶点 v 的出度的出度是以是以 v 为始点的有向为始点的有向边的条数边的条数,记作记作 OD(v)。n路径路径 在图在图 G(V,E)中中,若从顶点若从顶点 vi 出发出发,沿沿一些边经过一些顶点一些边经过一些顶点 vp1,vp2,vpm,到达顶,到达顶点点vj。则称顶点序列。则称顶点序列(vi vp1 vp2.vpm vj)为从顶为从顶点点vi 到顶
5、点到顶点 vj 的路径。它经过的边的路径。它经过的边(vi,vp1)、(vp1,vp2)、.、(vpm,vj)应是属于应是属于E的边。的边。146-146-7 7n路径长度路径长度 非带权图的路径长度是指此路径上非带权图的路径长度是指此路径上边的条数。带权图的路径长度是指路径上各边的条数。带权图的路径长度是指路径上各边的权之和。边的权之和。n简单路径简单路径 若路径上各顶点若路径上各顶点 v1,v2,.,vm 均不均不 互相重复互相重复,则称这样的路径为简单路径。则称这样的路径为简单路径。n回路回路 若路径上第一个顶点若路径上第一个顶点 v1 与最后一个顶与最后一个顶点点vm 重合重合,则称这
6、样的路径为回路或环。则称这样的路径为回路或环。012301230123146-146-8 8n连通图与连通分量连通图与连通分量 在无向图中在无向图中,若从顶点若从顶点v1到顶点到顶点v2有路径有路径,则称顶点则称顶点v1与与v2是连通的。是连通的。如果图中任意一对顶点都是连通的如果图中任意一对顶点都是连通的,则称此图则称此图是连通图。非连通图的极大连通子图叫做连是连通图。非连通图的极大连通子图叫做连通分量。通分量。n强连通图与强连通分量强连通图与强连通分量 在有向图中在有向图中,若对于若对于每一对顶点每一对顶点vi和和vj,都存在一条从都存在一条从vi到到vj和从和从vj到到vi的路径的路径,
7、则称此图是强连通图。非强连通图则称此图是强连通图。非强连通图的极大强连通子图叫做强连通分量。的极大强连通子图叫做强连通分量。n生成树生成树 一个连通图的生成树是其极小连通一个连通图的生成树是其极小连通子图,在子图,在 n 个顶点的情形下,有个顶点的情形下,有 n-1 条边。条边。146-146-9 9图的抽象数据类型图的抽象数据类型class Graph/对象:由一个顶点的非空集合和一个边集合构成/每条边由一个顶点对来表示。public:Graph();/建立一个空的图 void insertVertex(const T&vertex);/插入一个顶点vertex,该顶点暂时没有入边 void
8、 insertEdge(int v1,int v2,int weight);/在图中插入一条边(v1,v2,w)void removeVertex(int v);/在图中删除顶点v和所有关联到它的边 146-146-1010 void removeEdge(int v1,int v2);/在图中删去边(v1,v2)bool IsEmpty();/若图中没有顶点,则返回true,否则返回false T getWeight(int v1,int v2);/函数返回边(v1,v2)的权值 int getFirstNeighbor(int v);/给出顶点 v 第一个邻接顶点的位置 int getNe
9、xtNeighbor(int v,int w);/给出顶点 v 的某邻接顶点 w 的下一个邻接顶点;146-146-11 11图的存储表示图的存储表示n图的模板基类图的模板基类 在模板类定义中的数据类型在模板类定义中的数据类型参数表参数表 中,中,T是顶点数据的是顶点数据的类型,类型,E是边上所附数据的类型。是边上所附数据的类型。n这个模板基类是按照最复杂的情况(即带权这个模板基类是按照最复杂的情况(即带权无向图)来定义的,如果需要使用非带权图,无向图)来定义的,如果需要使用非带权图,可将数据类型参数表可将数据类型参数表 改为改为。n如果使用的是有向图,也可以对程序做相应如果使用的是有向图,也
10、可以对程序做相应的改动。的改动。146-146-1212图的模板基类图的模板基类 const int maxWeight=;/无穷大的值(=)const int DefaultVertices=30;/最大顶点数(=n)template class Graph /图的类定义protected:int maxVertices;/图中最大顶点数 int numEdges;/当前边数 int numVertices;/当前顶点数 int getVertexPos(T vertex);/给出顶点vertex在图中位置public:146-146-1313 Graph(int sz=DefaultVer
11、tices);/构造函数 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);/取顶点 v 的第一个邻接顶点146-14
12、6-1414virtual int getNextNeighbor(int v,int w);/取邻接顶点 w 的下一邻接顶点 virtual bool insertVertex(const T vertex);/插入一个顶点vertex virtual bool insertEdge(int v1,int v2,E cost);/插入边(v1,v2),权为cost virtual bool removeVertex(int v);/删去顶点 v 和所有与相关联边 virtual bool removeEdge(int v1,int v2);/在图中删去边(v1,v2);146-146-151
13、5邻接矩阵邻接矩阵 (Adjacency Matrix)(Adjacency Matrix)n在图的邻接矩阵表示中,有一个记录各个顶在图的邻接矩阵表示中,有一个记录各个顶点信息的点信息的顶点表顶点表,还有一个表示各个顶点之,还有一个表示各个顶点之间关系的间关系的邻接矩阵邻接矩阵。n设图设图 A=(V,E)是一个有是一个有 n 个顶点的图个顶点的图,图的图的邻接矩阵是一个二维数组邻接矩阵是一个二维数组 A.edgenn,定义:,定义:,),(,.否否则则或或者者如如果果01EdgeAEjiEjiji146-146-1616n无向图的邻接矩阵是对称的无向图的邻接矩阵是对称的;n有向图的邻接矩阵可能
14、是不对称的。有向图的邻接矩阵可能是不对称的。0101101001011010A.edge0123012000101010A.edge146-146-1717n在有向图中在有向图中,统计第统计第 i 行行 1 的个数可得顶点的个数可得顶点 i 的的出度出度,统计第,统计第 j 列列 1 的个数可得顶点的个数可得顶点 j 的的入入度度。n在无向图中在无向图中,统计第统计第 i 行行(列列)1 的个数可得顶的个数可得顶点点i 的的度度。网络的邻接矩阵网络的邻接矩阵jiji,ji,jiji,ji,jijiji若若或或且且若若或或且且若若,)(,)(),(0EEEEWA.edge146-146-1818
15、068053290410A.edge863129542031用邻接矩阵表示的图的类定义用邻接矩阵表示的图的类定义template class Graphmtx:public Graph friend istream&operator (istream&in,Graphmtx&G);/输入146-146-1919friend ostream&operator (ostream&out,Graphmtx&G);/输出private:T*VerticesList;/顶点表 E*Edge;/邻接矩阵int getVertexPos(T vertex)/给出顶点vertex在图中的位置 for(int
16、i=0;i=0&i=numVertices?VerticesListi:NULL;E getWeight(int v1,int v2)/取边(v1,v2)上权值 return v1!=-1&v2!=-1?Edgev1v2:0;int getFirstNeighbor(int v);/取顶点 v 的第一个邻接顶点146-146-2121 int getNextNeighbor(int v,int w);/取 v 的邻接顶点 w 的下一邻接顶点 bool insertVertex(const T vertex);/插入顶点vertex bool insertEdge(int v1,int v2,E
17、 cost);/插入边(v1,v2),权值为cost bool removeVertex(int v);/删去顶点 v 和所有与它相关联的边 bool removeEdge(int v1,int v2);/在图中删去边(v1,v2);146-146-2222template Graphmtx:Graphmtx(int sz)/构造函数 maxVertices=sz;numVertices=0;numEdges=0;int i,j;VerticesList=new TmaxVertices;/创建顶点表 Edge=(int*)new int*maxVertices;for(i=0;i maxVe
18、rtices;i+)Edgei=new intmaxVertices;/邻接矩阵 for(i=0;i maxVertices;i+)/矩阵初始化 for(j=0;j maxVertices;j+)Edgeij=(i=j)?0:maxWeight;146-146-2323template int Graphmtx:getFirstNeighbor(int v)/给出顶点位置为v的第一个邻接顶点的位置,/如果找不到,则函数返回-1 if(v!=-1)for(int col=0;col numVertices;col+)if(Edgevcol&Edgevcol maxWeight)return co
19、l;return-1;146-146-2424template int Graphmtx:getNextNeighbor(int v,int w)/给出顶点 v 的某邻接顶点 w 的下一个邻接顶点 if(v!=-1&w!=-1)for(int col=w+1;col numVertices;col+)if(Edgevcol&Edgevcol maxWeight)return col;return-1;146-146-2525n邻接表是邻接矩阵的改进形式。为此需要把邻接表是邻接矩阵的改进形式。为此需要把邻接矩阵的各行分别组织为一个单链表。邻接矩阵的各行分别组织为一个单链表。n在邻接表中,同一个顶
20、点发出的边链接在同在邻接表中,同一个顶点发出的边链接在同一个边链表中,每一个链结点代表一条边一个边链表中,每一个链结点代表一条边(边结点),结点中有另一顶点的下标(边结点),结点中有另一顶点的下标 dest 和指针和指针 link。对于带权图,边结点中还要保。对于带权图,边结点中还要保存该边的权值存该边的权值cost。n顶点表的第顶点表的第 i 个顶点中保存该顶点的数据,个顶点中保存该顶点的数据,以及它对应边链表的头指针以及它对应边链表的头指针adj。邻接表邻接表 (Adjacency List)(Adjacency List)146-146-2626ABCDdata adjABCD0123d
21、est linkdest link 130210无向图的邻接表无向图的邻接表n统计某顶点对应边链表中结点个数,可得该顶统计某顶点对应边链表中结点个数,可得该顶点的度。点的度。n某条边某条边(vi,vj)在邻接表中有两个边结点,分别在邻接表中有两个边结点,分别在第在第 i 个顶点和第个顶点和第 j 个顶点对应的边链表中。个顶点对应的边链表中。146-146-2727data adjABC012dest linkdest link 邻接表邻接表(出边表出边表)data adjABC012dest link逆邻接表逆邻接表(入边表入边表)102 011有向图的邻接表和逆邻接表有向图的邻接表和逆邻接表
22、ABC146-146-2828BACD69528data adjABCD0123dest cost link 1 53 62 83 21 9(出边表出边表)(顶点表顶点表)网络网络 (带权图带权图)的邻接表的邻接表n统计出边表中结点个数,得到该顶点的出度;统计出边表中结点个数,得到该顶点的出度;n统计入边表中结点个数,得到该顶点的入度。统计入边表中结点个数,得到该顶点的入度。146-146-2929n在邻接表的边链表中,各个边结点的链入顺序在邻接表的边链表中,各个边结点的链入顺序任意,视边结点输入次序而定。任意,视边结点输入次序而定。n设图中有设图中有 n 个顶点,个顶点,e 条边,则用邻接表
23、表示条边,则用邻接表表示无向图时,需要无向图时,需要 n 个顶点结点,个顶点结点,2e 个边结点;个边结点;用邻接表表示有向图时,若不考虑逆邻接表,用邻接表表示有向图时,若不考虑逆邻接表,只需只需 n 个顶点结点,个顶点结点,e 个边结点。个边结点。n当当 e 远远小于远远小于 n2 时,可以节省大量的存储空时,可以节省大量的存储空间。此外,把同一个顶点的所有边链接在一个间。此外,把同一个顶点的所有边链接在一个单链表中,也使得图的操作更为便捷。单链表中,也使得图的操作更为便捷。146-146-3030用邻接表表示的图的类定义用邻接表表示的图的类定义 template struct Edge /
24、边结点的定义 int dest;/边的另一顶点位置 E cost;/边上的权值 Edge*link;/下一条边链指针 Edge()/构造函数 Edge(int num,E cost)/构造函数 :dest(num),weight(cost),link(NULL)bool operator!=(Edge&R)const return dest!=R.dest;/判边等否;146-146-3131template struct Vertex /顶点的定义 T data;/顶点的名字Edge*adj;/边链表的头指针;template class Graphlnk:public Graph /图的类
25、定义friend istream&operator (istream&in,Graphlnk&G);/输入friend ostream&operator (ostream&out,Graphlnk&G);/输出146-146-3232private:Vertex*NodeTable;/顶点表(各边链表的头结点)int getVertexPos(const T vertx)/给出顶点vertex在图中的位置 for(int i=0;i=0&i NumVertices)?NodeTablei.data:0;E getWeight(int v1,int v2);/取边(v1,v2)权值bool in
展开阅读全文