数据结构复习课件:Data Structure -Graph.PPT
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《数据结构复习课件:Data Structure -Graph.PPT》由用户(罗嗣辉)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构复习课件:Data Structure -Graph 数据结构 复习 课件 Data Graph
- 资源描述:
-
1、n图的基本概念图的基本概念n图的存储表示图的存储表示n图的遍历与连通性图的遍历与连通性 n最小生成树最小生成树n最短路径最短路径 n活动网络活动网络 (vertex): 。class Graph public: Graph ( ); void InsertVertex ( const Type & vertex ); void InsertEdge ( const int v1, const int v2, int weight ); void RemoveVertex ( const int v ); void RemoveEdge ( const int v1, const int v2
2、); int IsEmpty ( ); Type GetWeight ( const int v1, const int v2 ); int GetFirstNeighbor ( const int v ); int GetNextNeighbor ( const int v1, const int v2 ); , ),( , , .否则否则如果如果01AEjiEjijiEdge或者 ),( , ,),( .jijiEjiEjijijiWjiEdge=! !0=A对角线但是否则,或且如果template class Graph private: SeqList VerticesList (Ma
3、xVertices); DistType EdgeMaxVerticesMaxVertices; int numVertex, numEdge; int FindVertex ( SeqList & L; const NameType &vertex ) return L.Find (vertex); int GetVertexPos ( Const NameType &vertex ) return FindVertex (VerticesList, vertex ); public: Graph ( const int sz=MaxNumEdges ); int GraphEmpty (
4、)const return VerticesList.IsEmpty ( ); int GraphFull( ) const return VerticesList.IsFull( ) | numEdges =MaxEdges; int NumberOfVertices ( ) return numVertex; int NumberOfEdges ( ) return numEdges; NameType GetValue ( const int i ) return i = 0 & i VerticesList.length-1 ? VerticesList.Elemi : NULL; i
5、nt GetWeight ( const int v1, const int v2 ); int GetFirstNeighbor ( const int v ); int GetNextNeighbor ( const int v1, const int v2 ); void InsertVertex ( const NameType & vertex ); void InsertEdge ( const int v1, const int v2, DistType weight ); void RemoveVertex ( const int v ); void RemoveEdge (
6、const int v1, const int v2 );template Graph:Graph(const int sz)/构造函数构造函数 for ( int i = 0; i sz; i+ ) for ( int j = 0; j sz; j+ ) Edgeij = 0; numVertex=numEdges = 0;template DistType Graph:GetWeight( const int v1, const int v2 ) /给出以顶点给出以顶点 v1 和和 v2 为两端点的边上的权值为两端点的边上的权值 if ( v1 != -1 & v2 != -1 ) ret
7、urn Edgev1v2; else return 0;template int Graph:GetFirstNeighbor ( const int v ) /给出顶点位置为给出顶点位置为 v 的第一个邻接顶点的位置的第一个邻接顶点的位置 if ( v != -1 ) for ( int col = 0; col 0 ) return col; return -1; template int Graph:GetNextNeighbor ( const int v1, const int v2 ) /给出顶点给出顶点v1的某邻接顶点的某邻接顶点v2的下一个邻接顶点的下一个邻接顶点 if ( v
8、1 != -1 & v2 != -1 ) for ( int col = v2+1; col 0 ) return col; return -1; template class Graph;template struct Edge int dest; DistType cost; Edge *link; Edge ( ) Edge ( int D, DistType C ) : dest (D), cost (C), link (NULL) int operator != ( const Edge &E ) const return dest != E.dest; template struc
9、t Vertex NameType data; Edge *adj;template class Graph friend class vertex ;friend class Edge;private: Vertex *NodeTable; int NumVertices; int MaxVertices; int NumEdges; int GetVertexPos ( const Type & vertex );public: Graph ( int sz ); Graph ( ); int GraphEmpty ( ) const return NumVertices = 0; int
10、 GraphFull ( ) const return NumVertices = MaxVertices | NumEdges =MaxEdges; NameType GetValue ( const int i ) return i = 0 & i NumVertices ? NodeTablei.data : NULL; int NumberOfVertices ( ) return NumVertices; int NumberOfEdges ( ) return NumEdges; void InsertVertex ( const NameType & vertex ); void
11、 RemoveVertex ( const int v ); void InsertEdge ( const int v1, const int v2, const DistType weight ); void RemoveEdge ( const int v1, const int v2 ); DistType GetWeight ( const int v1, const int v2 ); int GetFirstNeighbor ( const int v ); int GetNextNeighbor ( const int v1, const int v2 );template G
12、raph:Graph ( const int sz = DefaultSize ) : NumVertices (0), MaxVertices (sz), NumEdges (0) int n, e, k, j; NameType name, tail, head; DistType weight; NodeTable = /创建顶点表创建顶点表 new VertexMaxVertices; cin n; /输入顶点个数输入顶点个数 for ( int i = 0; i name; InserVertex ( name ); cin e; /输入边条数输入边条数 for ( i =0; i
13、tail head weight; k = GetVertexPos ( tail ); j = GetVertexPos ( head ); InsertEdge ( k, j, weight ); template Graph:Graph ( ) for ( int i = 0; i NumVertices; i+ ) Edge *p = NodeTablei.adj; while ( p != NULL ) /逐条边释放逐条边释放 NodeTablei.adj = plink; delete p; p = NodeTablei.adj; delete NodeTable; /释放顶点表释
14、放顶点表template int Graph:GetVertexPos ( Const NameType & vertex ) /根据顶点名根据顶点名vertex查找该顶点在邻接表中的位置查找该顶点在邻接表中的位置 for ( int i =0; i NumVertices; i+ ) if ( NodeTablei.data = vertex ) return i; return -1;template int Graph:GetFirstNeighbor ( const int v ) /查找顶点查找顶点 v 的第一个邻接顶点在邻接表中的位置的第一个邻接顶点在邻接表中的位置 if ( v
15、!= -1 ) /若顶点存在若顶点存在 Edge *p = NodeTablev.adj; if ( p != NULL ) return pdest; return -1; /若顶点不存在若顶点不存在template int Graph: GetNextNeighbor ( const int v1, const int v2 ) /查找顶点查找顶点 v1 在邻接顶点在邻接顶点 v2 后下一个邻接顶点后下一个邻接顶点 if ( v1 != -1 ) Edge *p = NodeTablev1.adj; while ( p != NULL ) if ( pdest = v2 & plink !
16、= NULL ) return plinkdest; /返回下一个邻接顶点在邻接表中的位置返回下一个邻接顶点在邻接表中的位置 else p = plink; return -1; /没有查到下一个邻接顶点返回没有查到下一个邻接顶点返回- -1template DistType Graph:GetWeight ( const int v1, const int v2) /取两端点为取两端点为 v1 和和 v2 的边上的权值的边上的权值 if ( v1 != -1 & v2 != -1 ) Edge *p = NodeTablev1.adj; while ( p != NULL ) if ( pd
17、est = v2 ) return pcost; else p = plink; return 0; mark vertex1 vertex2 path1 path2 data Firstout mark vertex1 vertex2 path1 path2 data Firstin Firstoutvoid Graph:DFS ( ) visited = new int n; /创建数组创建数组 visited for ( int i = 0; i n; i+ ) visited i = 0; /访问标记数组访问标记数组 visited 初始化初始化 for(int i=0; in;i+)
18、if(visitedi=0) DFS(i,visited); delete visited; /释放释放 visited viod Graph:DFS ( const int v, int visited ) cout GetValue (v) ; /访问顶点访问顶点 v visitedv = 1; /顶点顶点 v 作访问标记作访问标记 int w = GetFirstNeighbor (v); /取取 v 的第一个邻接顶点的第一个邻接顶点 w while ( w != -1 ) /若邻接顶点若邻接顶点 w 存在存在 if ( !visitedw ) DFS ( w, visited ); /
19、若若顶点顶点 w 未访问过未访问过, , 递归访问顶点递归访问顶点 w w = GetNextNeighbor ( v, w ); /取顶点取顶点 v 的排在的排在 w 后面的下一个邻接顶点后面的下一个邻接顶点 void Graph : BFS ( const int v ) visited = new intNumCertices; /创建创建 visited for ( int i = 0; i NumVertices; i+ ) visitedi = 0; /visited 初始化初始化 cout GetValue (v) ; visitedv = 1; Queue q; q.EnQue
20、ue (v); /访问访问 v, 进队列进队列 while ( !q.IsEmpty ( ) ) /队空搜索结束队空搜索结束 v = q.DeQueue ( ); /不空不空, 出队列出队列 int w = GetFirstNeighbor (v); /取顶点取顶点 v 的的第一个邻接顶点第一个邻接顶点 w while ( w != -1 ) /若邻接顶点若邻接顶点 w 存在存在 if ( !visitedw ) /若该邻接顶点未访问过若该邻接顶点未访问过 cout GetValue (w) ; /访问访问 visitedw = 1; q.EnQueue (w); /进队进队 w = GetN
21、extNeighbor (v, w); /取顶点取顶点 v 的排在的排在 w 后面的下一邻接顶点后面的下一邻接顶点 /重复检测重复检测 v 的所有邻接顶点的所有邻接顶点 delete visited; void Graph:Components ( ) visited = new intNumCertices; /创建创建visited for ( int i = 0; i NumVertices; i+ ) visitedi = 0; /visited 初始化初始化 for ( i = 0; i NumVertices; i+ ) if ( !visitedi ) /检测所有顶点是否访问过检
22、测所有顶点是否访问过 DFS ( i, visited ); /从未访问的顶点出发访问从未访问的顶点出发访问 OutputNewComponent ( ); /输出一个连通分量输出一个连通分量 delete visited; /释放释放visitedlowu = min dfnu, min loww | w 是是 u 的一个子女的一个子女 , min dfnx | (u, x) 是一条回边是一条回边 计算计算dfn与与low的算法的算法 (1)void Graph:DfnLow ( const int x ) /公有函数:从顶点公有函数:从顶点x开始深度优先搜索开始深度优先搜索 int num
23、 = 1; / num是访问计数器是访问计数器 dfn = new intNumVertices; low = new intNumVertices; /dfn是深度优先数是深度优先数, low是最小祖先访问顺序号是最小祖先访问顺序号 for ( int i = 0; i NumVertices; i+ ) dfni = lowi = 0; /给予访问计数器给予访问计数器num及及dfnu, lowu初值初值 DfnLow ( x, -1 ); /从根从根x开始开始 delete dfn; delete low;计算计算dfn与与low的算法的算法 (2)void Graph:DfnLow (
24、 const int u, const int v ) /私有函数:从顶点私有函数:从顶点 u 开始深度优先搜索计算开始深度优先搜索计算dfn/ 和和low。在产生的生成树中。在产生的生成树中 v 是是 u 的双亲。的双亲。 dfnu = lowu = num+; int w = GetFirstNeighbor (u); while ( w != -1 ) /对对u所有邻接顶点所有邻接顶点w循环循环 if ( dfnw = 0 ) /未访问过未访问过, w是是u的孩子的孩子 DfnLow ( w, u ); /从从w递归深度优先搜索递归深度优先搜索 lowu = min2 ( lowu, l
25、oww ); /子女子女w的的loww先求出先求出, 再求再求lowu else if ( w != v ) /w访问过且访问过且w不是不是v,是回边是回边 lowu = min2 ( lowu, dfnw ); /根据回边另一顶点根据回边另一顶点w调整调整lowu w = GetNextNeighbor (u, w); /找顶点找顶点u在在w后面后面的下一个邻接顶点的下一个邻接顶点 void Graph:Biconnected ( ) /公有函数:从顶点公有函数:从顶点0开始深度优先搜索开始深度优先搜索 int num = 1; /访问计数器访问计数器num dfn = new intNum
展开阅读全文