数据库图数据库_第1页
数据库图数据库_第2页
数据库图数据库_第3页
数据库图数据库_第4页
数据库图数据库_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据库图数据库第一页,共一百一十二页,编辑于2023年,星期三例245136G1图G1中:V(G1)={1,2,3,4,5,6}E(G1)={<1,2>,<2,1>,<2,3>,<2,4>,<3,5>,<5,6>,<6,3>}例157324G26图G2中:V(G2)={1,2,3,4,5,6,7}E(G1)={(1,2),(1,3),(2,3),(2,4),(2,5),(5,6),(5,7)}第二页,共一百一十二页,编辑于2023年,星期三有向完备图——n个顶点的有向图最大边数是n(n-1)无向完备图——n个顶点的无向图最大边数是n(n-1)/2权——与图的边或弧相关的数叫~网——带权的图叫~子图——如果图G(V,E)和图G‘(V’,E‘),满足:V’VE’E则称G‘为G的子图顶点的度无向图中,顶点的度为与每个顶点相连的边数有向图中,顶点的度分成入度与出度入度:以该顶点为头的弧的数目出度:以该顶点为尾的弧的数目路径——路径是顶点的序列V={Vi0,Vi1,……Vin},满足(Vij-1,Vij)E或<Vij-1,Vij>E,(1<jn)第三页,共一百一十二页,编辑于2023年,星期三路径长度——沿路径边的数目或沿路径各边权值之和回路——第一个顶点和最后一个顶点相同的路径叫~简单路径——序列中顶点不重复出现的路径叫~简单回路——除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路叫~连通——从顶点V到顶点W有一条路径,则说V和W是连通的连通图——图中任意两个顶点都是连通的叫~连通分量——非连通图的每一个连通部分叫~强连通图——有向图中,如果对每一对Vi,VjV,ViVj,从Vi到Vj和从Vj到

Vi都存在路径,则称G是~第四页,共一百一十二页,编辑于2023年,星期三例213213有向完备图无向完备图356例245136图与子图例245136G1顶点2入度:1出度:3顶点4入度:1出度:0例157324G26顶点5的度:3顶点2的度:4第五页,共一百一十二页,编辑于2023年,星期三例157324G26例245136G1路径:1,2,3,5,6,3路径长度:5简单路径:1,2,3,5回路:1,2,3,5,6,3,1简单回路:3,5,6,3路径:1,2,5,7,6,5,2,3路径长度:7简单路径:1,2,5,7,6回路:1,2,5,7,6,5,2,1简单回路:1,2,3,1第六页,共一百一十二页,编辑于2023年,星期三连通图例245136强连通图356例非连通图连通分量例245136第七页,共一百一十二页,编辑于2023年,星期三6.2图的存储结构多重链表例G12413例15324G2V1V2^^V4^V3^^V1V2V4^V5^V3第八页,共一百一十二页,编辑于2023年,星期三邻接矩阵——表示顶点间相联关系的矩阵定义:设G=(V,E)是有n1个顶点的图,G的邻接矩阵A是具有以下性质的n阶方阵例G12413例15324G2第九页,共一百一十二页,编辑于2023年,星期三特点:无向图的邻接矩阵对称,可压缩存储;有n个顶点的无向图需存储空间为n(n+1)/2有向图邻接矩阵不一定对称;有n个顶点的有向图需存储空间为n²无向图中顶点Vi的度TD(Vi)是邻接矩阵A中第i行元素之和有向图中,顶点Vi的出度是A中第i行元素之和顶点Vi的入度是A中第i列元素之和网络的邻接矩阵可定义为:第十页,共一百一十二页,编辑于2023年,星期三例1452375318642第十一页,共一百一十二页,编辑于2023年,星期三关联矩阵——表示顶点与边的关联关系的矩阵定义:设G=(V,E)是有n1个顶点,e0条边的图,G的关联矩阵A是具有以下性质的ne阶矩阵第十二页,共一百一十二页,编辑于2023年,星期三4321例G124131234例15324G2123456432156第十三页,共一百一十二页,编辑于2023年,星期三例BDAC123456ABCD432156第十四页,共一百一十二页,编辑于2023年,星期三特点关联矩阵每列只有两个非零元素,是稀疏矩阵;n越大,零元素比率越大无向图中顶点Vi的度TD(Vi)是关联矩阵A中第i行元素之和有向图中,顶点Vi的出度是A中第i行中“1”的个数顶点Vi的入度是A中第i行中“-1”的个数第十五页,共一百一十二页,编辑于2023年,星期三邻接表实现:为图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点Vi的边(有向图中指以Vi为尾的弧)typedefstructnode{intadjvex;//邻接点域,存放与Vi邻接的点在表头数组中的位置structnode*next;//链域,指示下一条边或弧指向的点}JD;adjvexnext表头接点:typedefstructtnode{intvexdata;//存放顶点信息structnode*firstarc;//指示第一个邻接点}TD;TDga[M];//ga[0]不用vexdatafirstarc第十六页,共一百一十二页,编辑于2023年,星期三例G1bdac例aecbdG21234acdbvexdatafirstarc3241^^^^adjvexnext1234acdbvexdatafirstarc4212^^^adjvexnext5e435^15323^第十七页,共一百一十二页,编辑于2023年,星期三特点无向图中顶点Vi的度为第i个单链表中的结点数有向图中顶点Vi的出度为第i个单链表中的结点个数顶点Vi的入度为整个单链表中邻接点域值是i的结点个数逆邻接表:有向图中对每个结点建立以Vi为头的弧的单链表例G1bdac1234acdbvexdatafirstarc41^1^^3^adjvexnext第十八页,共一百一十二页,编辑于2023年,星期三6.3图的遍历深度优先遍历(DFS)方法:从图的某一顶点V0出发,访问此顶点;然后依次从V0的未被访问的邻接点出发,深度优先遍历图,直至图中所有和V0相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止V1V2V4V5V3V7V6V8例深度遍历:V1V2V4V8V5V3V6V7第十九页,共一百一十二页,编辑于2023年,星期三V1V2V4V5V3V7V6V8例例V1V2V4V5V3V7V6V8深度遍历:V1V2V4V8V5V6V3V7深度遍历:V1V2V4V8V5V6V3V7第二十页,共一百一十二页,编辑于2023年,星期三V1V2V4V5V3V7V6V8例深度遍历:V1V2V4V8V3V6V7V5第二十一页,共一百一十二页,编辑于2023年,星期三深度优先遍历算法递归算法开始访问V0,置标志求V0邻接点有邻接点w求下一邻接点wV0W访问过结束NYNYDFS开始标志数组初始化Vi=1Vi访问过DFSVi=Vi+1Vi==Vexnums结束NNYYCh6_1.c第二十二页,共一百一十二页,编辑于2023年,星期三V1V2V4V5V3V7V6V8例深度遍历:V112341342vexdatafirstarc2783^^^adjvexnext55641^51282^678678736354^^^V3V7V6V2V5V8V4第二十三页,共一百一十二页,编辑于2023年,星期三voiddefarc(intx[M][M],intn,TDgs[]){inti,j;JD*w,*v;for(i=0;i<n;i++){gs[i].vexdata=i;gs[i].firstarc=NULL;for(j=0;j<n;j++){if((gs[i].firstarc==NULL)&&(x[i][j]!=0)){w=(JD*)malloc(sizeof(JD));w->adjvex=j;v=w;gs[i].firstarc=w;}elseif(gs[i].firstarc!=NULL&&x[i][j]!=0){w=(JD*)malloc(sizeof(JD));w->adjvex=j;v->next=w;v=w;}}}}123413422783^^^55641^51282^678678736354^^^V1V2V4V5V3V7V6V8第二十四页,共一百一十二页,编辑于2023年,星期三voidtraver(TDg[],intn){inti;staticintvisited[M];for(i=0;i<n;i++)visited[i]=0;for(i=0;i<n;i++)if(visited[i]==0) dfs(g,i,visited);}123413422783^^^55641^51282^678678736354^^^第二十五页,共一百一十二页,编辑于2023年,星期三voiddfs(TDg[],intv,intvisited[]){JD*w;inti;printf("%d",v+1);visited[v]=1;w=g[v].firstarc;while(w!=NULL){i=w->adjvex;if(visited[i]==0) dfs(g,i,visited);w=w->next;}}123413422783^^^55641^51282^678678736354^^^V1V2V4V5V3V7V6V8例第二十六页,共一百一十二页,编辑于2023年,星期三V1V2V4V5V3V7V6V8例12341342vexdatafirstarc2783^^^adjvexnext556^482^6786787^^^深度遍历:V1V3V7V6V2V4V8V5第二十七页,共一百一十二页,编辑于2023年,星期三广度优先遍历(BFS)方法:从图的某一顶点V0出发,访问此顶点后,依次访问V0的各个未曾访问过的邻接点;然后分别从这些邻接点出发,广度优先遍历图,直至图中所有已被访问的顶点的邻接点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未被访问的顶点作起点,重复上述过程,直至图中所有顶点都被访问为止V1V2V4V5V3V7V6V8例广度遍历:V1V2V3V4V5V6V7V8第二十八页,共一百一十二页,编辑于2023年,星期三V1V2V4V5V3V7V6V8例例V1V2V4V5V3V7V6V8广度遍历:V1V2V3V4V5V6V7V8广度遍历:V1V2V3V4V5V6V7V8第二十九页,共一百一十二页,编辑于2023年,星期三V1V2V4V5V3V7V6V8例广度遍历:V1V2V3V4V6V7V8V5第三十页,共一百一十二页,编辑于2023年,星期三广度优先遍历算法开始标志数组初始化Vi=1Vi访问过BFSVi=Vi+1Vi==Vexnums结束NNYYCh6_2.c第三十一页,共一百一十二页,编辑于2023年,星期三开始访问V0,置标志求V邻接点ww存在吗V下一邻接点ww访问过结束NYNYBFS初始化队列V0入队队列空吗队头V出队访问w,置标志w入队NaaY第三十二页,共一百一十二页,编辑于2023年,星期三voidtraver(TDg[],intn){inti;staticintvisited[M];for(i=0;i<n;i++)visited[i]=0;for(i=0;i<n;i++)if(visited[i]==0)bfs(g,i,visited);}}例1423512341342vexdatafirstarc1123^^^adjvexnext555^15523^44第三十三页,共一百一十二页,编辑于2023年,星期三例14235voidbfs(TDg[],intv,intvisited[]){intqu[M],f=0,r=0;JD*p;printf("%d\n",v+1);visited[v]=1;qu[0]=v;while(f<=r){v=qu[f++];p=g[v].firstarc;while(p!=NULL){v=p->adjvex;if(visited[v]==0){visited[v]=1;printf("%d\n",v+1);qu[++r]=v;}p=p->next;}}12341342vexdatafirstarc1123^^^adjvexnext555^15523^44第三十四页,共一百一十二页,编辑于2023年,星期三例1423512341342vexdatafirstarc1123^^^adjvexnext555^15523^440123451fr遍历序列:10123452fr遍历序列:1201234523fr遍历序列:123第三十五页,共一百一十二页,编辑于2023年,星期三例1423512341342vexdatafirstarc1123^^^adjvexnext555^15523^44012345234fr遍历序列:123401234534fr遍历序列:1234012345345fr遍历序列:12345第三十六页,共一百一十二页,编辑于2023年,星期三01234525fr遍历序列:123450123455fr遍历序列:12345012345

fr遍历序列:12345例1423512341342vexdatafirstarc1123^^^adjvexnext555^15523^44第三十七页,共一百一十二页,编辑于2023年,星期三6.4生成树生成树定义:所有顶点均由边连接在一起,但不存在回路的图叫~深度优先生成树与广度优先生成树生成森林:非连通图每个连通分量的生成树一起组成非连通图的~说明一个图可以有许多棵不同的生成树所有生成树具有以下共同特点:生成树的顶点个数与图的顶点个数相同生成树是图的极小连通子图一个有n个顶点的连通图的生成树有n-1条边生成树中任意两个顶点间的路径是唯一的在生成树中再加一条边必然形成回路含n个顶点n-1条边的图不一定是生成树GHKI第三十八页,共一百一十二页,编辑于2023年,星期三V1V2V4V5V3V7V6V8例深度遍历:V1V2V4V8V5V3V6V7V1V2V4V5V3V7V6V8深度优先生成树V1V2V4V5V3V7V6V8广度优先生成树V1V2V4V5V3V7V6V8V1V2V4V5V3V7V6V8广度遍历:V1V2V3V4V5V6V7V8第三十九页,共一百一十二页,编辑于2023年,星期三例ABLMCFDEGHKIJABLMCFJDEGHKI深度优先生成森林第四十页,共一百一十二页,编辑于2023年,星期三最小生成树问题提出要在n个城市间建立通信联络网,顶点——表示城市权——城市间建立通信线路所需花费代价希望找到一棵生成树,它的每条边上的权值之和(即建立该通信网所需花费的总代价)最小———最小代价生成树问题分析1654327131791812752410n个城市间,最多可设置n(n-1)/2条线路n个城市间建立通信网,只需n-1条线路问题转化为:如何在可能的线路中选择n-1条,能把所有城市(顶点)均连起来,且总耗费(各边权值之和)最小第四十一页,共一百一十二页,编辑于2023年,星期三构造最小生成树方法方法一:普里姆(Prim)算法算法思想:设N=(V,{E})是连通网,TE是N上最小生成树中边的集合初始令U={u0},(u0V),TE=在所有uU,vV-U的边(u,v)E中,找一条代价最小的边(u0,v0)将(u0,v0)并入集合TE,同时v0并入U重复上述操作直至U=V为止,则T=(V,{TE})为N的最小生成树算法实现:图用邻接矩阵表示算法描述算法评价:T(n)=O(n²)Ch6_3.c第四十二页,共一百一十二页,编辑于2023年,星期三例1654326513566425131163141643142116432142516543214253第四十三页,共一百一十二页,编辑于2023年,星期三10123450123451-21-41-1例16543265135664251-51-3165432651356642516543214253第四十四页,共一百一十二页,编辑于2023年,星期三#defineM30#defineMAX100voidminispantree_PRIM(intad[][M],intn){inti,j,k,p,q,wm;q=p=n-1;ad[q][q]=1;for(k=0;k<(n-1);k++)//每次找一条边,共需n-1条边{wm=MAX;for(i=0;i<n;i++)//对n个点进行扫描if(ad[i][i]==1)

for(j=0;j<n;j++)//查找与已联入的点边权值最小的边if((ad[j][j]==0)&&(ad[i][j]<wm))

{wm=ad[i][j];p=i;q=j;}

ad[q][q]=1;printf("%d%d%d\n",p+1,q+1,ad[p][q]);if(p>q)ad[p][q]=-ad[p][q];elsead[q][p]=-ad[q][p];}}第四十五页,共一百一十二页,编辑于2023年,星期三方法二:克鲁斯卡尔(Kruskal)算法算法思想:设连通网N=(V,{E}),令最小生成树初始状态为只有n个顶点而无边的非连通图T=(V,{}),每个顶点自成一个连通分量在E中选取代价最小的边,若该边依附的顶点落在T中不同的连通分量上,则将此边加入到T中;否则,舍去此边,选取下一条代价最小的边依此类推,直至T中所有顶点都在同一连通分量上为止例165432651356642516543212345第四十六页,共一百一十二页,编辑于2023年,星期三(0)用顶点数组和边数组存放顶点和边信息(1)初始时,令每个顶点的jihe互不相同;每个边的flag为0(2)选出权值最小且flag为0的边(3)若该边依附的两个顶点的jihe值不同,即非连通,则令该边的flag=1,选中该边;再令该边依附的两顶点的jihe以及两集合中所有顶点的jihe相同若该边依附的两个顶点的jihe值相同,即连通,则令该边的flag=2,即舍去该边(4)重复上述步骤,直到选出n-1条边为止顶点结点:typedefstruct{intdata;//顶点信息intjihe;}VEX;边结点:typedefstruct{intvexh,vext;//边依附的两顶点intweight;//边的权值intflag;//标志域}EDGE;算法实现:第四十七页,共一百一十二页,编辑于2023年,星期三例1654326513566425Ch6_30.c算法描述:datajihe124536124536124536vexhweight112213233544vextflag6153550000000134256789334556666426000011111421112222216543212345第四十八页,共一百一十二页,编辑于2023年,星期三voidminitree_KRUSKAL(void){intn,i,m,min,k,j;VEXt[M];EDGEe[M];printf("Inputnumberofvertexandedge:");scanf("%d%d",&n,&m);for(i=0;i<n;i++)//建立点的集合{printf("t[%d].data=:",i); scanf("%d",&t[i].data); t[i].jihe=i;}for(i=0;i<m;i++)//建立边的集合{printf("vexh,vext,weight:"); scanf("%d%d%d",&e[i].vexh,&e[i].vext,&e[i].weight); e[i].flag=0;}第四十九页,共一百一十二页,编辑于2023年,星期三i=1;while(i<n)//找n-1条权值最小的边,k值为边的编号{min=MAX; for(j=0;j<m;j++) {if(e[j].weight<min&&e[j].flag==0) {min=e[j].weight; k=j; } } if(t[e[k].vexh].jihe!=t[e[k].vext].jihe) {e[k].flag=1; for(j=0;j<n;j++)//所有集合相同的点都改为同一集合 if(t[j].jihe==t[e[k].vext].jihe) t[j].jihe=t[e[k].vexh].jihe; t[e[k].vext].jihe=t[e[k].vexh].jihe; i++; } else e[k].flag=2;}第五十页,共一百一十二页,编辑于2023年,星期三for(i=0;i<m;i++)//输出所有的点和边if(e[i].flag==1) printf("%d,%d:%d\n",e[i].vexh,e[i].vext,e[i].weight);}main(){minitree_KRUSKAL();}第五十一页,共一百一十二页,编辑于2023年,星期三6.5拓扑排序第五十二页,共一百一十二页,编辑于2023年,星期三6.5拓扑排序问题提出:学生选修课程问题顶点——表示课程有向弧——表示先决条件,若课程i是课程j的先决条件,则图中有弧<i,j>学生应按怎样的顺序学习这些课程,才能无矛盾、顺利地完成学业——拓扑排序 定义AOV网——用顶点表示活动,用弧表示活动间优先关系的有向图称为顶点表示活动的网(ActivityOnVertexnetwork),简称AOV网若<vi,vj>是图中有向边,则vi是vj的直接前驱;vj是vi的直接后继AOV网中不允许有回路,这意味着某项活动以自己为先决条件第五十三页,共一百一十二页,编辑于2023年,星期三拓扑排序——把AOV网络中各顶点按照它们相互之间的优先关系排列成一个线性序列的过程叫~检测AOV网中是否存在环方法:对有向图构造其顶点的拓扑有序序列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环拓扑排序的方法在有向图中选一个没有前驱的顶点且输出之从图中删除该顶点和所有以它为尾的弧重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止第五十四页,共一百一十二页,编辑于2023年,星期三例课程代号课程名称先修棵C1C2C3C4C5C6C7C8C9C10C11C12无C1C1,C2C1C3,C4C11C3.C5C3,C6无C9C9C1,C9,C10程序设计基础离散数学数据结构汇编语言语言的设计和分析计算机原理编译原理操作系统高等数学线性代数普通物理数值分析C1C2C3C4C5C6C7C8C9C10C11C12第五十五页,共一百一十二页,编辑于2023年,星期三C1C2C3C4C5C6C7C8C9C10C11C12拓扑序列:C1--C2--C3--C4--C5--C7--C9--C10--C11--C6--C12--C8或:C9--C10--C11--C6--C1--C12--C4--C2--C3--C5--C7--C8一个AOV网的拓扑序列不是唯一的第五十六页,共一百一十二页,编辑于2023年,星期三C1C2C3C4C5C6C7C8C9C10C11C12第五十七页,共一百一十二页,编辑于2023年,星期三C2C3C4C5C6C7C8C9C10C11C12拓扑序列:C1(1)C3C4C5C6C7C8C9C10C11C12拓扑序列:C1--C2(2)第五十八页,共一百一十二页,编辑于2023年,星期三C4C5C6C7C8C9C10C11C12拓扑序列:C1--C2--C3(3)C5C6C7C8C9C10C11C12拓扑序列:C1--C2--C3--C4(4)第五十九页,共一百一十二页,编辑于2023年,星期三C6C8C10C11C12拓扑序列:C1--C2--C3--C4--C5--C7--C9C6C8C11C12拓扑序列:C1--C2--C3--C4--C5--C7--C9--C10(8)C6C7C8C9C10C11C12拓扑序列:C1--C2--C3--C4--C5(5)C6C8C9C10C11C12拓扑序列:C1--C2--C3--C4--C5--C7(6)第六十页,共一百一十二页,编辑于2023年,星期三C6C8C12拓扑序列:C1--C2--C3--C4--C5--C7--C9--C10--C11(9)C8C12拓扑序列:C1--C2--C3--C4--C5--C7--C9--C10--C11--C6(10)C8拓扑序列:C1--C2--C3--C4--C5--C7--C9--C10--C11--C6--C12(11)拓扑序列:C1--C2--C3--C4--C5--C7--C9--C10--C11--C6--C12--C8(12)第六十一页,共一百一十二页,编辑于2023年,星期三算法实现以邻接表作存储结构把邻接表中所有入度为0的顶点进栈栈非空时,输出栈顶元素Vj并退栈;在邻接表中查找Vj的直接后继Vk,把Vk的入度减1;若Vk的入度为0则进栈重复上述操作直至栈空为止。若栈空时输出的顶点个数不是n,则有向图有环;否则,拓扑排序完毕邻接表结点:typedefstructnode{intvex;//顶点域structnode*next;//链域}JD;表头结点:typedefstructtnode{intin;//入度域structnode*link;//链域}TD;TDg[M];//g[0]不用第六十二页,共一百一十二页,编辑于2023年,星期三32104算法描述例1234560122inlink5543^^^vexnext3^25^240123456^Ch6_40.ctop16toptop第六十三页,共一百一十二页,编辑于2023年,星期三0122inlink5543^^^vexnext3^25^240123456^输出序列:63210416toptop第六十四页,共一百一十二页,编辑于2023年,星期三0122inlink5543^^^vexnext3^25^240123456^输出序列:6321041topp第六十五页,共一百一十二页,编辑于2023年,星期三0122inlink5543^^^vexnext2^25^240123456^输出序列:6321041topp第六十六页,共一百一十二页,编辑于2023年,星期三0122inlink5543^^^vexnext2^25^240123456^输出序列:6321041topp第六十七页,共一百一十二页,编辑于2023年,星期三0112inlink5543^^^vexnext2^25^240123456^输出序列:6321041topp第六十八页,共一百一十二页,编辑于2023年,星期三0112inlink5543^^^vexnext2^25^240123456^输出序列:6321041topp=NULL第六十九页,共一百一十二页,编辑于2023年,星期三0112inlink5543^^^vexnext2^25^240123456^输出序列:61321041toptop第七十页,共一百一十二页,编辑于2023年,星期三0112inlink5543^^^vexnext2^25^240123456^输出序列:6132104topp第七十一页,共一百一十二页,编辑于2023年,星期三0102inlink5543^^^vexnext2^25^240123456^输出序列:6132104topp4第七十二页,共一百一十二页,编辑于2023年,星期三0102inlink5543^^^vexnext2^25^240123456^输出序列:6132104p4top第七十三页,共一百一十二页,编辑于2023年,星期三0102inlink5543^^^vexnext2^25^240123456^输出序列:6132104p4top第七十四页,共一百一十二页,编辑于2023年,星期三0002inlink5543^^^vexnext2^25^240123456^输出序列:6132104p4top3第七十五页,共一百一十二页,编辑于2023年,星期三0002inlink5543^^^vexnext2^25^240123456^输出序列:6132104p4top3第七十六页,共一百一十二页,编辑于2023年,星期三0002inlink5543^^^vexnext2^25^240123456^输出序列:6132104p4top3第七十七页,共一百一十二页,编辑于2023年,星期三0001inlink5543^^^vexnext2^25^240123456^输出序列:6132104p4top3第七十八页,共一百一十二页,编辑于2023年,星期三0001inlink5543^^^vexnext2^25^240123456^输出序列:6132104p=NULL4top3第七十九页,共一百一十二页,编辑于2023年,星期三0001inlink5543^^^vexnext2^25^240123456^输出序列:613321044top3第八十页,共一百一十二页,编辑于2023年,星期三0001inlink5543^^^vexnext2^25^240123456^输出序列:613321044topp第八十一页,共一百一十二页,编辑于2023年,星期三0001inlink5543^^^vexnext1^25^240123456^输出序列:613321044topp第八十二页,共一百一十二页,编辑于2023年,星期三0001inlink5543^^^vexnext1^25^240123456^输出序列:613321044topp第八十三页,共一百一十二页,编辑于2023年,星期三0000inlink5543^^^vexnext1^25^240123456^输出序列:613321044topp2第八十四页,共一百一十二页,编辑于2023年,星期三0000inlink5543^^^vexnext1^25^240123456^输出序列:613321044topp2第八十五页,共一百一十二页,编辑于2023年,星期三0000inlink5543^^^vexnext1^25^240123456^输出序列:613321044top2p=NULL第八十六页,共一百一十二页,编辑于2023年,星期三0000inlink5543^^^vexnext1^25^240123456^输出序列:6132321044top2p=NULL第八十七页,共一百一十二页,编辑于2023年,星期三0000inlink5543^^^vexnext1^25^240123456^输出序列:6132321044topp=NULL第八十八页,共一百一十二页,编辑于2023年,星期三0000inlink5543^^^vexnext1^25^240123456^输出序列:61324321044top第八十九页,共一百一十二页,编辑于2023年,星期三0000inlink5543^^^vexnext1^25^240123456^输出序列:6132432104topp第九十页,共一百一十二页,编辑于2023年,星期三0000inlink5543^^^vexnext0^25^240123456^输出序列:6132432104topp5第九十一页,共一百一十二页,编辑于2023年,星期三0000inlink5543^^^vexnext0^25^240123456^输出序列:6132432104topp=NULL5第九十二页,共一百一十二页,编辑于2023年,星期三0000inlink5543^^^vexnext0^25^240123456^输出序列:61324532104top5第九十三页,共一百一十二页,编辑于2023年,星期三0000inlink5543^^^vexnext0^25^240123456^输出序列:61324532104topp=NULL第九十四页,共一百一十二页,编辑于2023年,星期三voidtoposort(TDg[],intn){inttop,m,k,j,x;ints[M];//top:栈顶,s[]:栈,m:个数,k:邻接点,x:中间变量JD*p;top=0;m=0;for(j=1;j<=n;j++)//入度为0的点入栈if(g[j].in==0)s[top++]=j;while(top>=0){x=s[top--];printf("%d\n",x);m++;p=g[x].link;

while(p!=NULL){k=p->vex;g[k].in--;if(g[k].in==0)s[top++]=k;p=p->next;}}printf("m=%d\n",m);if(m<n)printf("Thenetworkhasacycle\n");}第九十五页,共一百一十二页,编辑于2023年,星期三算法分析建邻接表:T(n)=O(e)搜索入度为0的顶点的时间:T(n)=O(n)拓扑排序:T(n)=O(n+e)Ch6_4.c第九十六页,共一百一十二页,编辑于2023年,星期三6.6关键路径问题提出把工程计划表示为有向图,用顶点表示事件,弧表示活动;每个事件表示在它之前的活动已完成,在它之后的活动可以开始例设一个工程有11项活动,9个事件事件V1——表示整个工程开始事件V9——表示整个工程结束问题:(1)完成整项工程至少需要多少时间?(2)哪些活动是影响工程进度的关键?987645321a1=6a2=4a3=5a4=1a5=1a6=2a7=9a8=7a9=4a10=2a11=4第九十七页,共一百一十二页,编辑于2023年,星期三定义AOE网(ActivityOnEdge)——也叫边表示活动的网。AOE网是一个带权的有向无环图,其中顶点表示事件,弧表示活动,权表示活动持续时间路径长度——路径上各活动持续时间之和关键路径——路径长度最长的路径叫~Ve(j)——表示事件Vj的最早发生时间Vl(j)——表示事件Vj的最迟发生时间e(i)——表示活动ai的最早开始时间l(i)——表示活动ai的最迟开始时间l(i)-e(i)——表示完成活动ai的时间余量关键活动——关键路径上的活动叫~,即l(i)=e(i)的活动第九十八页,共一百一十二页,编辑于2023年,星期三问题分析如何找e(i)=l(i)的关键活动?设活动ai用弧<j,k>表示,其持续时间记为:dut(<j,k>)则有:(1)e(i)=Ve(j)(2)l(i)=Vl(k)-dut(<j,k>)jkai如何求Ve(j)和Vl(j)?(1)从Ve(1)=0开始向前递推(2)从Vl(n)=Ve(n)开始向后递推第九十九页,共一百一十二页,编辑于2023年,星期三求关键路径步骤求Ve(i)求Vl(j)求e(i)求l(i)计算l(i)-e(i)987645321a2=4a3=5a5=1a6=2a9=4a1=6a4=1a7=9a8=7a10=2a11=4V1V2V3V4V5V6V7V8V9顶点VeVl0645771614180668710161418a1a2a3a4a5a6a7a8a9a10a11活动ell-e00002266046258377077071031616014140033第一百页,共一百一十二页,编辑于2023年,星期三算法实现以邻接表作存储结构从源点V1出发,令Ve[1]=0,按拓扑序列求各顶点的Ve[i]从汇点Vn出发,令Vl[n]=Ve[n],按逆拓扑序列求其余各顶点的Vl[i]根据各顶点的Ve和Vl值,计算每条弧的e[i]和l[i],找出e[i]=l[i]的关键活动邻接表结点:typedefstructnode{intvex;//顶点域intlength;structnode*next;//链域}JD;表头结点:typedefstructtnode{intvexdata;intin;//入度域structnode*link;//链域}TD;TDg[M];//g[0]不用第一百零一页,共一百一十二页,编辑于2023年,星期三算法描述输入顶点和弧信息,建立其邻接表计算每个顶点的入度对其进行拓扑排序排序过程中求顶点的Ve[i]将得到的拓扑序列进栈按逆拓扑序列求顶点的Vl[i]计算每条弧的e[i]和l[i],找出e[i]=l[i]的关键活动Ch6_20.c987645321a2=4a3=5a5=1a6=2a9=4a1=6a4=1a7=9a8=7a10=2a11=4第一百零二页,共一百一十二页,编辑于2023年,星期三987645321a2=4a3=5a5=1a6=2a9=4a1=6a4=1a7=9a8=7a10=2a11=4inlinkvexnextvexdatalength123456789123456789011121122263445^79^51^62^51^87^84^910^94^第一百零三页,共一百一十二页,编辑于2023年,星期三6.7最短路径问题提出用带权的有向图表示一个交通运输网,图中:顶点——表示城市边——表示城市间的交通联系权——表示此线路的长度或沿此线路运输所花的时间或费用等问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径——最短路径从某个源点到其余各顶点的最短路径51643208562301371732913长度最短路径<V0,V1><V0,V2><V0,V2,V3><V0,V2,V3,V4><V0,V2,V3,V4,V5><V0,V1,V6>813192120第一百零四页,共一百一十二页,编辑于2023年,星期三迪杰斯特拉(Dijkstra)算法思想按路径长度递增次序产生最短路径算法:把V分成两组:(1)S:已求出最短路径的顶点的集合(2)V-S=T:尚未确定最短路径的顶点集合将T中顶点按最短路径递增的次序加入到S中,保证:(1)从源点V0到S中各顶点的最短路径长度都不大于从V0到T中任何顶点的最短路径长度(2)每个顶点对应一个距离值S中顶点:从V0到此顶点的最短路径长度T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度依据:可以证明V0到T中顶点Vk的最短路径,或是从V0到Vk的直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和(反证法可证

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论