《图及其应用》课件.ppt
《《图及其应用》课件.ppt》由会员分享,可在线阅读,更多相关《《图及其应用》课件.ppt(74页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第15讲讲:数据结构之数据结构之 图图一、一、图的基本概念图的基本概念二、图的存储结构二、图的存储结构三、图的遍历三、图的遍历四、无向图的传递闭包四、无向图的传递闭包五、最短五、最短路径路径六、最小生成树六、最小生成树七、拓扑排序七、拓扑排序1、图的的定义、图的的定义 图是由顶点图是由顶点V V的集合和边的集合和边E E的集合组成的二元组:的集合组成的二元组:记记G=G=(V V,E E)存在一个结点存在一个结点v v,可能含有多个前驱结点和后继结点。,可能含有多个前驱结点和后继结点。一、一、图的基本概念图的基本概念1253412534无向图:无向图:在图在图G=G=(V V,E E)中,如
2、果对于任意的顶点)中,如果对于任意的顶点a a,bVbV,当当(a(a,b)Eb)E时,必有(时,必有(b b,a a)EE(即关系(即关系R R对称),此图称为对称),此图称为无向图。无向图。无向图中用不带箭头的边表示顶点的关系无向图中用不带箭头的边表示顶点的关系V=1,2,3,4,5E=(1,2),(1,3),(1,4),(2,3),(2,5),(3,5),(4,5)125342、无向图和有向图、无向图和有向图有向图:有向图:如果对于任意的顶点如果对于任意的顶点a a,bVbV,当,当(a(a,b)Eb)E时时 ,(b(b,a)Ea)E未未必成立,则称此图为有向图。必成立,则称此图为有向图
3、。在有向图中,通常用带箭头的边连接两个有关联的结点。在有向图中,通常用带箭头的边连接两个有关联的结点。V=1,2,3,4,5 V=1,2,3,4,5 E=,E=,12534在无向图中:顶点在无向图中:顶点v v的度是指与顶点的度是指与顶点v v相连的边的数目。相连的边的数目。D(2)=3D(2)=33 3、顶点的度、入度和出度、顶点的度、入度和出度在有向图中:在有向图中:入度入度以该顶点为终点的边的数目和以该顶点为终点的边的数目和.ID(3)=2 .ID(3)=2 出度出度以该顶点为起点的边的数目和以该顶点为起点的边的数目和.OD(3)=1.OD(3)=1度数为奇数的顶点叫做奇点,度数为偶数的
4、点叫做偶点。度数为奇数的顶点叫做奇点,度数为偶数的点叫做偶点。度:等于该顶点的入度与出度之和。度:等于该顶点的入度与出度之和。D(5)=ID(5)+OD(5)=1+2=3D(5)=ID(5)+OD(5)=1+2=3 1253412534图中所有顶点的度图中所有顶点的度=边的两倍边的两倍图1图2完全图完全图4 4、路径、路径、简单路径、回路简单路径、回路 在在图图G=G=(V V,E E)中中,如如果果对对于于结结点点a a,b b,存存在在满满足足下下述述条条件件的的结结点点序序列列x x1 1xxk k(k1)(k1)x x1 1=a=a,x xk k=b =b (x(xi i,x xi+1
5、i+1)E i=1k-1E i=1k-1则则称称结结点点序序列列x x1 1=a=a,x x2 2,x xk k=b=b为为结结点点a a到到结结点点b b的的一一条条路路径径,而而路路径径上上边边的数目(的数目(k-1k-1)称为该路径的长度。)称为该路径的长度。1253412534图1图2图图1:1、(1,2,3,5)长度长度=32、(1,2,3,5,2)长度长度=43、(1,2,5,4,1)长度长度=4图图2:(1,2,5,4)长度长度=3(1)、如果一条路径上的结点除起点)、如果一条路径上的结点除起点x1和终点和终点xk可以相同外,其它结可以相同外,其它结点均不相同,则称此路径为一条简
6、单路径。点均不相同,则称此路径为一条简单路径。(2)、)、x1=xk的简单路径称为回路(也称为环)的简单路径称为回路(也称为环)5、连通、连通图、连通分量、连通、连通图、连通分量(无向图无向图)直观理解:直观理解:连通:连通:“连成一片连成一片”。连通图:连通图:“能连成一片的图能连成一片的图”。1253412534678图一图一图二图二确切定义:确切定义:连通连通:如果从顶点:如果从顶点u u到到v v有路径,则称有路径,则称u u和和v v是连通的。是连通的。连通图连通图:图中任意的两个顶点:图中任意的两个顶点u u和和v v都是连通的。都是连通的。图一是连通图,图二是非连通图图一是连通图
7、,图二是非连通图连通分量:无向图中的连通分量:无向图中的极大连通子图极大连通子图。图二中有图二中有3 3个连通分量:个连通分量:1 2 4 5 3 6 7 81 2 4 5 3 6 7 8求连通分量数,最大连通分量等。求连通分量数,最大连通分量等。有向图:强连通、强连通图、强连通分量有向图:强连通、强连通图、强连通分量6、带权图、带权图图中的边可以加上表示某种含图中的边可以加上表示某种含义的数值,数值称为边的权,此图义的数值,数值称为边的权,此图称为带权图。也称为网。称为带权图。也称为网。一般的图边上没有数字,边仅表示两一般的图边上没有数字,边仅表示两个顶点的相连接关系。个顶点的相连接关系。1
8、25342342132二、图的存储结构二、图的存储结构1 1、邻接矩阵(静态数组)、邻接矩阵(静态数组)2 2、邻接表(指针数组)、邻接表(指针数组)3 3、边集数组、边集数组4 4、十字链表、十字链表5 5、邻接多重表、邻接多重表图的邻接矩阵表示法图的邻接矩阵表示法 邻邻接接矩矩阵阵是是表表示示结结点点间间相相邻邻关关系系的的矩矩阵阵。若若G=G=(V V,E E)是是一一个个具具有有n n个个结结点点的的图图,则则G G的的邻邻接接矩矩阵阵是是如如下下定定义义的的二二维维数数组组a a。1、邻接矩阵、邻接矩阵ai,j=1(或权值或权值):无向图:有边:无向图:有边(i,j)和边和边(j,i
9、)有向图:有边有向图:有边0:i到到j无边无边1253401110101011100110001011101234512345125342342132022302010321002300040324012345123451253401010001011000000000001101234512345对角线为对角线为0:自身不相连。:自身不相连。无向图:是对称矩阵。有向图一般不是。无向图:是对称矩阵。有向图一般不是。第第i行非行非0的个数是结点的个数是结点i的度的度具体到题目时,数据的给出格式多种多样:具体到题目时,数据的给出格式多种多样:1)、直接给出邻接矩阵,直接读即可。)、直接给出邻接矩阵
10、,直接读即可。如:如:输入文件内容:输入文件内容:50223020103210023000403240Maxn=100A:array1.maxn,1.maxn of integerFillchar(a,sizeof(a),0);Readln(n);For i:=1 to n do for j:=1 to n do read(aI,j);1253423421322)、给出边的顶点。)、给出边的顶点。如输入文件:两个顶点及权值如输入文件:两个顶点及权值57122132143231253352454125342342132Readln(n);readln(m);Fork:=1tomdobeginre
11、adln(I,j,x);aI,j:=x;aj,i:=x;end2、邻接表、邻接表:方法方法1125342342132123452232431231531221521354233244头指针头指针邻接点指针邻接点指针结点邻接点指针邻接点边权值下一个邻接点指针typeedge=node;node=recorddata:integer;weight:integer;next:edge;end;vpoint=recorddata:integer;link:edge;end;vara:array1.maxnofvpoint;/具体操作:具体操作:datalinkdataweightnext邻接表方法邻接
12、表方法2:1234523413512515234125342342132权值单独用另外的数组权值单独用另外的数组W设置结点指针设置结点指针结点邻接点指针typepoint=node;node=recorddata:integer;next:point;end;vara:array1.maxvofpoint;/具体操作:具体操作:datanext三、图的遍历三、图的遍历 给出一个图给出一个图G G,从某一个初始点出发,按照一定的搜索方法对图,从某一个初始点出发,按照一定的搜索方法对图中的每一个结点访问仅且访问一次的过程。中的每一个结点访问仅且访问一次的过程。访问结点:处理结点的过程。如输出结点的
13、信息、求和等,访问结点:处理结点的过程。如输出结点的信息、求和等,根据题目要求。根据题目要求。按照搜索方案的不同,通常有两种遍历方法:按照搜索方案的不同,通常有两种遍历方法:深度优先搜索深度优先搜索dfsdfs 广度优先搜索广度优先搜索bfsbfs 1 1、深度优先搜索、深度优先搜索DFSDFS遍历算法(递归过程):遍历算法(递归过程):1)1)从某一初始出发点从某一初始出发点i i开始访问:开始访问:输出该点编号;并对该点作输出该点编号;并对该点作被访问标志(以免被重复访问)。被访问标志(以免被重复访问)。2)2)再从再从i i的其中一个未被访问的邻接点的其中一个未被访问的邻接点j j作为初
14、始点出发继续作为初始点出发继续深搜。深搜。当当i i的所有邻接点都被访问完,则退回到的所有邻接点都被访问完,则退回到i i的父结点的另一个邻的父结点的另一个邻接点接点k k再继续深搜。再继续深搜。直到全部接点访问完毕直到全部接点访问完毕14356782910proceduredfs(k:integer);/从从k点出发遍历点出发遍历varj:integer;/局部变量?局部变量?beginwrite(k,);fk:=true;forj:=1tondoif(fj=false)and(ak,j=1)thendfs(j);end;/读入边的关系读入边的关系readln(n);readln(m);fo
15、ri:=1tomdobeginreadln(x,y);ax,y:=1;ay,x:=1;end;上图的遍历结果:上图的遍历结果:Dfs(1)?proceduremain;vari:integer;beginfillchar(f,sizeof(f),false);fori:=1tondoifnotfithendfs(i);end;2 2、广度优先搜索、广度优先搜索(宽度优先搜索)宽度优先搜索)BFSBFS 广度优先搜索广度优先搜索按层次按层次遍历的过程,其搜索过程如下:遍历的过程,其搜索过程如下:假假设设从从图图中中某某结结点点i i出出发发,在在访访问问了了i i之之后后依依次次访访问问i i的
16、的各各个个未未曾曾访访问问的的邻邻接接点点,然然后后分分别别从从这这些些邻邻接接点点出出发发按按广广度度优优先先搜搜索索的的顺顺序遍历图,直至图中所有可被访问的结点都被访问到。序遍历图,直至图中所有可被访问的结点都被访问到。14356782910procedurebfs(i:integer);/varj,k:integer;beginfillchar(q,sizeof(q),0);open:=0;closed:=1;q1:=i;write(i,);fi:=true;whileopencloseddobegininc(open);k:=qopen;forj:=1tondoif(ak,j=1)an
17、d(fj=false)thenbeginwrite(j,);fj:=true;inc(closed);qclosed:=j;end;end;end;3、图的遍历的简单应用、图的遍历的简单应用1 1、犯罪团伙、犯罪团伙 警察抓到了警察抓到了n n个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却个罪犯,警察根据经验知道他们属于不同的犯罪团伙,却不能判断有多少个团伙,但通过警察的审讯,知道其中的一些罪犯之间相不能判断有多少个团伙,但通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识。有可能一个犯罪互认识,已知同一犯罪团伙的成员之间直接或间接认识。有可能一个犯罪
18、团伙只有一个人。请你根据已知罪犯之间的关系,确定犯罪团伙的数量。团伙只有一个人。请你根据已知罪犯之间的关系,确定犯罪团伙的数量。已知罪犯的编号从已知罪犯的编号从1 1至至n n。输入:输入:第一行:第一行:n n(=1000,=1000,罪犯数量),罪犯数量),第二行:第二行:m m(50005000,关系数量),关系数量)以下若干行:每行两个数:以下若干行:每行两个数:I I 和和j j,中间一个空格隔开,表示罪犯,中间一个空格隔开,表示罪犯i i和罪犯和罪犯j j相互认识。相互认识。输出:输出:一个整数,犯罪团伙的数量。一个整数,犯罪团伙的数量。样例输入:11 8 1 24 35 41 3
19、5 67 105 108 9输出:3说明:共三个犯罪团伙。把把n个人看成图的个人看成图的n个顶点;相互认识的连一条边。个顶点;相互认识的连一条边。相互认识的所有人构成一个极大连通子图。相互认识的所有人构成一个极大连通子图。问题转化为:问题转化为:求无向图的连通分量求无向图的连通分量(有多少个极大连通子图)(有多少个极大连通子图)proceduremain;vari:integer;beginsum:=0;fillchar(f,sizeof(f),false);fori:=1tondoifnotfithenbegininc(sum);dfs(i);end;writeln(sum);end;123
20、54672、邮递员邮递员 邮递员在送信时,为了节省路途,自己规定:每次总是从n个村子中选择其中一个合适的村子出发,途中每个村子仅且经过一次,送完所有的信。已知各个村子的道路连通情况。请你帮邮递员选择一条合适的路线。输入:第一行:整数n:村子的个数。接下来是一个n*n的0、1矩阵,表示n个村子的连同情况,如:aI,j=1,表示第i和第j个村子之间有路可走,如果aI,j=0,表示他们之间无路可走。输出:一条可行的路线输入:70 1 0 1 1 0 01 0 1 0 1 0 00 1 0 0 0 0 11 0 0 0 0 0 01 1 0 0 0 1 00 0 0 0 1 0 10 0 1 0 0
21、1 0输出:2 3 7 6 5 1 4分析:分析:邮递员从某一个村子邮递员从某一个村子A出发;每个村子访问仅且访问一次,最后到达出发;每个村子访问仅且访问一次,最后到达村子村子B结束,从结束,从A到到B的路线成为的路线成为哈密顿路哈密顿路。如果如果A和和B重合,即回到出发点,称为重合,即回到出发点,称为哈密顿回路哈密顿回路。b:array1.maxnofinteger;/记录哈密顿路记录哈密顿路proceduremain;vari:integer;beginfori:=1tondobeginfillchar(visited,sizeof(visited),false);b1:=i;visite
22、di:=true;dfs(i,1);end;print(0);end;proceduredfs(i,k:integer);/当前已找到有当前已找到有k个点,要搜第个点,要搜第k+1个点个点varj:integer;beginifk=nthenprint(1);forj:=1tondoif(aj,i=1)and(visitedj=false)thenbeginvisitedj:=true;bk+1:=j;/找到第找到第k+1个点并记下个点并记下dfs(j,k+1);visitedj:=false;/回溯回溯end;end;怎样求哈密顿回路?怎样求哈密顿回路?3 3、安排座位、安排座位 n n个个
23、客客人人围围着着一一个个桌桌子子吃吃饭饭,每每一一个个人人都都至至少少认认识识其其他他的的2 2个个客客人人。请请设设计计程程序序求得求得n n个人的一种坐法,使得每个人都认识他左右的客人。个人的一种坐法,使得每个人都认识他左右的客人。输入输入:第一行第一行:n:n(吃饭人的个数)。(吃饭人的个数)。以下以下n n行:第行:第i i行的第一个数行的第一个数k k表示第表示第i i个人认识的人数,后面个人认识的人数,后面k k个数依次为个数依次为i i认识的认识的人的编号。人的编号。输出:所有座法,要求第一个人为输出:所有座法,要求第一个人为1 1号作为起点,按顺时针输出其它人的编号。号作为起点
24、,按顺时针输出其它人的编号。样例输入:62 3 63 4 5 63 1 4 63 2 3 53 2 4 64 1 2 3 5样例输出:1 3 4 2 5 61 3 4 5 2 61 6 2 5 4 31 6 5 2 4 34 4、素数链、素数链设计程序将设计程序将1 1。n n(2020)排成一排,使任意两个相邻的数的和为素数。)排成一排,使任意两个相邻的数的和为素数。第第1 1个和最后一个的和也为素数个和最后一个的和也为素数.输出输出:第一个数为第一个数为1.1.四、无向图的传递闭包四、无向图的传递闭包判断无向图的连通性判断无向图的连通性1234657输入图的边的信息,输出输入图的边的信息,
25、输出各点的连通行。各点的连通行。输入:输入:7122313345667输出:输出:11110001111000111100011110000000111000011100001110110000101000011010000010000000001000001010000010邻接矩阵邻接矩阵判断结点判断结点i和和j的连通性:的连通性:ijk1、结点、结点i和和j如果原来有边则连通。如果原来有边则连通。2、如果、如果i和和j之间没有边:之间没有边:如果存在另外的一个结点如果存在另外的一个结点k,满足:,满足:i与与k连通,连通,k与与j连通,则连通,则i与与j连通。连通。否则否则i和和j不连通
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图及其应用 及其 应用 课件
限制150内