《数据结构——C语言描述》第7章:图.ppt
《《数据结构——C语言描述》第7章:图.ppt》由会员分享,可在线阅读,更多相关《《数据结构——C语言描述》第7章:图.ppt(74页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 基本概念基本概念 图的存储结构图的存储结构 图的遍历图的遍历 生成树生成树 最短路径最短路径 拓扑排序拓扑排序第第7 7章章 图图7.1 图的基本概念图的基本概念图定义图定义图定义图定义 图是由顶点集合图是由顶点集合图是由顶点集合图是由顶点集合(vertex)及顶点间的关及顶点间的关及顶点间的关及顶点间的关系系系系集合组成的一种数据结构集合组成的一种数据结构集合组成的一种数据结构集合组成的一种数据结构:GraphGraph(V V,E E)其中其中其中其中 V V=x x|x x 某个数据对象某个数据对象某个数据对象某个数据对象 是顶点的有穷是顶点的有穷是顶点的有穷是顶点的有穷非空集合;非空
2、集合;非空集合;非空集合;E E=(=(x x,y y)|)|x x,y y V V 是顶点之间关系的有穷集合,也叫做边是顶点之间关系的有穷集合,也叫做边是顶点之间关系的有穷集合,也叫做边是顶点之间关系的有穷集合,也叫做边(edge)(edge)集集集集合。合。合。合。有向图与无向图有向图与无向图 若图若图G G中的每条边都是有方中的每条边都是有方向的,则称向的,则称G G为有向图。有向边也称为为有向图。有向边也称为弧弧。若图若图G G中的每条边都是没有方向的,则称中的每条边都是没有方向的,则称G G为为无向图。无向图。完全图完全图 对有对有n n个顶点的图,若为无向图且边个顶点的图,若为无向
3、图且边数为数为n(n-1)/2n(n-1)/2,则称其为,则称其为无向完全图无向完全图;若为;若为有向图且边数为有向图且边数为n(n-1)n(n-1),则称其为,则称其为有向完有向完全图。全图。邻接顶点邻接顶点 若(若(v vi i,v,vj j)是一条无向边,则称)是一条无向边,则称顶点顶点v vi i和和v vj j互为邻接点,或称互为邻接点,或称v vi i和和v vj j相邻接,相邻接,并称边(并称边(v vi i,v,vj j)关联于顶点)关联于顶点v vi i和和v vj j,或称,或称(v vi i,v,vj j)与顶点)与顶点v vi i和和v vj j相关联。相关联。n n顶
4、点的度顶点的度顶点的度顶点的度 一个顶点一个顶点一个顶点一个顶点v v的度是与它相关联的边的条的度是与它相关联的边的条的度是与它相关联的边的条的度是与它相关联的边的条数。记作数。记作数。记作数。记作TD(TD(v v)。顶点顶点顶点顶点 v v 的入度的入度的入度的入度 是以是以是以是以 v v 为终点的有向边的条数为终点的有向边的条数为终点的有向边的条数为终点的有向边的条数,记作记作记作记作 ID(v);ID(v);顶点顶点顶点顶点 v v 的出度的出度的出度的出度是以是以是以是以 v v 为始点的有向边的条数为始点的有向边的条数为始点的有向边的条数为始点的有向边的条数,记作记作记作记作 O
5、D(v)OD(v)。n n子图子图子图子图 设有两个图设有两个图设有两个图设有两个图 GG(V,E)(V,E)和和和和 GG(V,E)(V,E)。若。若。若。若 VV V V 且且且且 EE E,E,则称则称则称则称 图图图图G G 是是是是 图图图图G G 的子图。的子图。的子图。的子图。路径路径路径路径 在图在图在图在图 G G G G(V V V V,E E E E)中中中中,若存在一个顶点序列若存在一个顶点序列若存在一个顶点序列若存在一个顶点序列 v v v vp p p p1 1 1 1,v v v vp p p p2 2 2 2,v v v vpmpmpmpm,使得,使得,使得,使
6、得(v v v vi i i i,v v v vp p p p1 1 1 1)、(v v v vp p p p1 1 1 1,v v v vp p p p2 2 2 2)、.、(v v v vpmpmpmpm,v v v vj j j j)均属于均属于均属于均属于E E E E,则称顶点则称顶点则称顶点则称顶点v v v vi i i i到到到到v v v vj j j j存在一存在一存在一存在一 条路径。若一条路径上除了条路径。若一条路径上除了条路径。若一条路径上除了条路径。若一条路径上除了v v v vi i i i 和和和和v v v vj j j j 可以相同外,可以相同外,可以相同外
7、,可以相同外,其余顶点均不相同,则称此路径为一条其余顶点均不相同,则称此路径为一条其余顶点均不相同,则称此路径为一条其余顶点均不相同,则称此路径为一条简单路径简单路径简单路径简单路径 。起点和终点相同的路径称为。起点和终点相同的路径称为。起点和终点相同的路径称为。起点和终点相同的路径称为简单回路或简单环简单回路或简单环简单回路或简单环简单回路或简单环。图的连通图的连通图的连通图的连通 在无向图在无向图在无向图在无向图G G G G中,若两个顶点中,若两个顶点中,若两个顶点中,若两个顶点v v v vi i i i和和和和v v v vj j j j之间有之间有之间有之间有 路径存在,则称路径存
8、在,则称路径存在,则称路径存在,则称v v v vi i i i 和和和和v v v vj j j j 是连通的。若是连通的。若是连通的。若是连通的。若G G G G中任意两中任意两中任意两中任意两 个顶点都是连通的,则称个顶点都是连通的,则称个顶点都是连通的,则称个顶点都是连通的,则称G G G G为为为为连通图连通图连通图连通图。非连通图的非连通图的非连通图的非连通图的 极大连通子图叫做极大连通子图叫做极大连通子图叫做极大连通子图叫做连通分量连通分量连通分量连通分量。强连通图与强连通分量强连通图与强连通分量强连通图与强连通分量强连通图与强连通分量 在有向图中在有向图中在有向图中在有向图中,
9、若对于每一若对于每一若对于每一若对于每一对顶点对顶点对顶点对顶点vivivivi和和和和vj,vj,vj,vj,都存在一条从都存在一条从都存在一条从都存在一条从vivivivi到到到到vjvjvjvj和从和从和从和从vjvjvjvj到到到到vivivivi的的的的路径路径路径路径,则称此图是强连通图。非强连通图的极大强连则称此图是强连通图。非强连通图的极大强连则称此图是强连通图。非强连通图的极大强连则称此图是强连通图。非强连通图的极大强连通子图叫做强连通分量。通子图叫做强连通分量。通子图叫做强连通分量。通子图叫做强连通分量。权权权权 某些图的边具有与它相关的数某些图的边具有与它相关的数某些图的
10、边具有与它相关的数某些图的边具有与它相关的数,称之为权。这称之为权。这称之为权。这称之为权。这种带权图叫做种带权图叫做种带权图叫做种带权图叫做网络网络网络网络。12356874ABDCE1079667123151660304535804075权图权图权图权图 生成树生成树 一个连通图的生成树是它的极小一个连通图的生成树是它的极小 连通子图,在连通子图,在n个顶点的情形下,有个顶点的情形下,有n-1条条 边。边。n n生成林生成林 若若G G是一个不连通的无向图,是一个不连通的无向图,G G的的每个连通分量都有一棵生成树,这些生成每个连通分量都有一棵生成树,这些生成树构成树构成G G的生成森林。
11、的生成森林。7.2 图的存储结构图的存储结构 在图的邻接矩阵表示中,有一个记录各个顶点信在图的邻接矩阵表示中,有一个记录各个顶点信在图的邻接矩阵表示中,有一个记录各个顶点信在图的邻接矩阵表示中,有一个记录各个顶点信息的顶点表,还有一个表示各个顶点之间关系的息的顶点表,还有一个表示各个顶点之间关系的息的顶点表,还有一个表示各个顶点之间关系的息的顶点表,还有一个表示各个顶点之间关系的邻接矩阵。邻接矩阵。邻接矩阵。邻接矩阵。设图设图设图设图 A=(V,E)A=(V,E)是一个有是一个有是一个有是一个有 n n 个顶点的图,则图的邻个顶点的图,则图的邻个顶点的图,则图的邻个顶点的图,则图的邻接矩阵是一
12、个二维数组接矩阵是一个二维数组接矩阵是一个二维数组接矩阵是一个二维数组 A.EdgennA.Edgenn,定义:,定义:,定义:,定义:无向图的邻接矩阵是对称的,有向图的邻接矩阵无向图的邻接矩阵是对称的,有向图的邻接矩阵无向图的邻接矩阵是对称的,有向图的邻接矩阵无向图的邻接矩阵是对称的,有向图的邻接矩阵可能是不对称的。可能是不对称的。可能是不对称的。可能是不对称的。邻接矩阵邻接矩阵(Adjacency Matrix)在有向图中在有向图中在有向图中在有向图中,统计第统计第统计第统计第 i i 行行行行 1 1 的个数可得顶点的个数可得顶点的个数可得顶点的个数可得顶点 i i 的出度,的出度,的出
13、度,的出度,统计第统计第统计第统计第 j j 列列列列 1 1 的个数可得顶点的个数可得顶点的个数可得顶点的个数可得顶点 j j 的入度。的入度。的入度。的入度。在无向图中在无向图中在无向图中在无向图中,统计第统计第统计第统计第 i i 行行行行(列列列列)1)1 的个数可得顶点的个数可得顶点的个数可得顶点的个数可得顶点i i 的度。的度。的度。的度。网络的邻接矩阵网络的邻接矩阵邻接矩阵表示法中图的类型定义邻接矩阵表示法中图的类型定义:#define MAXSIZE 100 /*图的顶点个数图的顶点个数*/typedef int datatype;typedef struct datatype
14、 vexsMAXSIZE;/*顶点信息表顶点信息表*/int edgesMAXSIZE MAXSIZE;*邻接矩阵邻接矩阵*/int n,e;/*顶点数和边数顶点数和边数*/graph;21435无向图无向图无向图无向图BADCE有向图有向图有向图有向图215346203050407080有向权图有向权图有向权图有向权图邻接矩阵表示法中无向网络的建立算法邻接矩阵表示法中无向网络的建立算法void Create_Graph(graph *ga)int i,j,k,w;printf(请输入图的顶点数和边数:请输入图的顶点数和边数:n);scanf(%d,&(ga-n),&(ga-e);printf
15、(请输入顶点信息请输入顶点信息(顶点编号顶点编号),建立顶点信息表:,建立顶点信息表:n);for(i=0;in;i+)scanf(%c,&(ga-vexsi);/*输入顶点信息输入顶点信息*/for(i=0;in;i+)/*邻接矩阵初始化邻接矩阵初始化*/for(j=0;jn;j+)ga-edgesij=0;for(k=0;ke;k+)/*读入边的顶点编号和权值,建立邻接矩阵读入边的顶点编号和权值,建立邻接矩阵*/printf(请输入第请输入第%d条边的顶点序号条边的顶点序号i,j和权值和权值w:,k+1);scanf(%d,%d,%d,&i,&j,&w);ga-edgesij=w;ga-e
16、dgesji=w;算法分析算法分析该算法的执行时间是该算法的执行时间是O(n+n2+e),由于,由于en);for(i=1;in;i+)/*读入顶点信息,建立顶点表读入顶点信息,建立顶点表*/scanf(“n%c”,&(ga-adlistidata);ga-adlistifirst=NULL;e=0;scanf(“n%d,%dn”,&i,&j);/*读入一个顶点对号读入一个顶点对号i和和j*/while(i0)/*读入顶点对号读入顶点对号,建立边表建立边表*/e+;/*累计边数累计边数*/p=(pointer)malloc(size(struct node);/*生成新的邻接点序号为生成新的邻
17、接点序号为j的表结点的表结点*/p-vertex=j;p-next=ga-adlistifirst;ga-adlisti.first=p;/*将新表结点插入到顶点将新表结点插入到顶点vi的边表的头部的边表的头部*/p=(pointer)malloc(size(struct node);/*生成邻接点序号为生成邻接点序号为i的表结点的表结点*/p-vertex=i;p-next=ga-adlistj.first;ga-adlistj.first=p;/*将新表结点插入到顶点将新表结点插入到顶点vj的边表头部的边表头部*/scanf(“n%d,%dn”,&i,&j);/*读入一个顶点对号读入一个顶
18、点对号i和和j*/ga-e=e;算法的时间复杂度是算法的时间复杂度是O(ne)在邻接表的边链表中,各个表结点的链入顺序在邻接表的边链表中,各个表结点的链入顺序任意,视表结点输入次序而定。任意,视表结点输入次序而定。设图中有设图中有 n 个顶点,个顶点,e 条边,则用邻接表表示条边,则用邻接表表示无向图时,需要无向图时,需要 n 个表头结点,个表头结点,2e 个表结点;个表结点;用邻接表表示有向图时,若不考虑逆邻接表,用邻接表表示有向图时,若不考虑逆邻接表,只需只需 n 个表头结点,个表头结点,e 个表结点。个表结点。带权图的边结点中保存该边上的权值带权图的边结点中保存该边上的权值 cost。网
19、络网络(带权图带权图)的邻接表的邻接表表结点vertexcostnext7.3 图的遍历性图的遍历性 从已给的连通图中某一顶点出发,沿着一些边访遍从已给的连通图中某一顶点出发,沿着一些边访遍从已给的连通图中某一顶点出发,沿着一些边访遍从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次,就图中所有的顶点,且使每个顶点仅被访问一次,就图中所有的顶点,且使每个顶点仅被访问一次,就图中所有的顶点,且使每个顶点仅被访问一次,就叫做叫做叫做叫做图的遍历图的遍历图的遍历图的遍历 (Graph Traversal)(Graph Traversal)。图中可能存在回路,且图的任
20、一顶点都可能与其它图中可能存在回路,且图的任一顶点都可能与其它图中可能存在回路,且图的任一顶点都可能与其它图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些顶点相通,在访问完某个顶点之后可能会沿着某些顶点相通,在访问完某个顶点之后可能会沿着某些顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。边又回到了曾经访问过的顶点。边又回到了曾经访问过的顶点。边又回到了曾经访问过的顶点。为了避免重复访问,可设置一个标志顶点是否被访为了避免重复访问,可设置一个标志顶点是否被访为了避免重复访问,可设置一个标志顶点是否被访为了避免重复访问,可设置一个标
21、志顶点是否被访问过的辅助数组问过的辅助数组问过的辅助数组问过的辅助数组 visited visited ,它的初始状态为,它的初始状态为,它的初始状态为,它的初始状态为 0 0,在,在,在,在图的遍历过程中,一旦某一个顶点图的遍历过程中,一旦某一个顶点图的遍历过程中,一旦某一个顶点图的遍历过程中,一旦某一个顶点 i i 被访问,就立被访问,就立被访问,就立被访问,就立即让即让即让即让 visited i visited i 为为为为 1 1,防止它被多次访问。,防止它被多次访问。,防止它被多次访问。,防止它被多次访问。深度优先搜索深度优先搜索DFS(Depth First Search)深度优
22、先搜索的示例深度优先搜索的示例 DFS DFS 在访问图中某一起始顶点在访问图中某一起始顶点在访问图中某一起始顶点在访问图中某一起始顶点 v v 后,由后,由后,由后,由 v v 出发,出发,出发,出发,访问它的任一邻接顶点访问它的任一邻接顶点访问它的任一邻接顶点访问它的任一邻接顶点 w w1 1;再从;再从;再从;再从 w w1 1 出发,访问与出发,访问与出发,访问与出发,访问与 w w1 1邻接但还没有访问过的顶点邻接但还没有访问过的顶点邻接但还没有访问过的顶点邻接但还没有访问过的顶点 w w2 2;然后再从;然后再从;然后再从;然后再从 w w2 2 出出出出发,进行类似的访问,发,进
23、行类似的访问,发,进行类似的访问,发,进行类似的访问,如此进行下去,直至到达如此进行下去,直至到达如此进行下去,直至到达如此进行下去,直至到达所有的邻接顶点都被访问过的顶点所有的邻接顶点都被访问过的顶点所有的邻接顶点都被访问过的顶点所有的邻接顶点都被访问过的顶点 u u 为止。接着,为止。接着,为止。接着,为止。接着,退回一步,退到前一次刚访问过的顶点,看是否还退回一步,退到前一次刚访问过的顶点,看是否还退回一步,退到前一次刚访问过的顶点,看是否还退回一步,退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。如果有,则访问此有其它没有被访问的邻接顶点。如果有,则访问此有其它没有被访问
24、的邻接顶点。如果有,则访问此有其它没有被访问的邻接顶点。如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访顶点,之后再从此顶点出发,进行与前述类似的访顶点,之后再从此顶点出发,进行与前述类似的访顶点,之后再从此顶点出发,进行与前述类似的访问;如果没有,就再退回一步进行搜索。重复上述问;如果没有,就再退回一步进行搜索。重复上述问;如果没有,就再退回一步进行搜索。重复上述问;如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。过程,直到连通图中所有顶点都被访问过为止。过程,直到连通图中所有顶点都被访问过为止。过程,直到连通图中所有顶点都被访问过为止。深度优先
25、搜索算法深度优先搜索算法void DFS(graph *g)/*按深度优先搜索法遍历图按深度优先搜索法遍历图g*/int i;for(i0;ig-n;i+)visidi=0;/*初始化数组初始化数组visid,使每个元素为,使每个元素为0*/*标示图中的每个结点都未曾访问过标示图中的每个结点都未曾访问过*/for(i=0;in;i+)if(!visidi)DFSM(g,i);/*调用函数调用函数DFSM,对图进行遍历,对图进行遍历*/void DFSM(graph *g,int i)/*邻接矩阵上进行邻接矩阵上进行DFS遍历遍历*/int j;printf(深度优先遍历结点:深度优先遍历结点:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构C语言描述 数据结构 语言 描述
限制150内