1 / 481

1、 图的定义和术语 2、图的存储结构 3、图的遍历 4、图的连通性问题 5、有向无环图及其应用 6、最短路径

1、 图的定义和术语 2、图的存储结构 3、图的遍历 4、图的连通性问题 5、有向无环图及其应用 6、最短路径. 第七章 图. 7.1 图的定义和术语. 无向图 G 2. 有向图 G 1. A. B. A. B. E. C. D. C. D. 结点(顶点). 结点(顶点). A. B. A. B. 有向边(弧)、弧尾(初始结点)、弧头(终止结点). 边(无向边). A. B. A. B. 有向图: G 2 =(V 2 ,E 2 ) V 2 = {A,B,C,D,E}

irish
Download Presentation

1、 图的定义和术语 2、图的存储结构 3、图的遍历 4、图的连通性问题 5、有向无环图及其应用 6、最短路径

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 1、图的定义和术语 2、图的存储结构 3、图的遍历 4、图的连通性问题 5、有向无环图及其应用 6、最短路径1、图的定义和术语 2、图的存储结构 3、图的遍历 4、图的连通性问题 5、有向无环图及其应用 6、最短路径 第七章 图

  2. 7.1 图的定义和术语 无向图 G2 有向图 G1 A B A B E C D C D 结点(顶点) 结点(顶点) A B A B 有向边(弧)、弧尾(初始结点)、弧头(终止结点) 边(无向边) A B A B 有向图:G2=(V2,E2) V2 = {A,B,C,D,E} E2 = {(A,B), (A,C),(B,D), (B,E), (C,E),(D,E)} 有向图:G1=(V1,E1) V1 = {A,B,C,D} E1 = {<A,B>, <A,C>, <C,D>, <D,A>}

  3. 有向图 G1 有向图G1的子图 A B A A B A B C D C C D C D 无向图 G2 无向图G2的子图 A B A A B A B A B E E E C D D C D C D

  4. 无向图的连通性 路径:在无向图G=(V,E)中由顶点v至v’的顶点序列。 回路或环:第一个顶点和最后一个顶点相同的路径。 简单回路或简单环:除第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路。 连通:顶点v至v’之间有路径存在 连通图:无向图图 G 的任意两点之间都是连通的,则称 G 是连通图。 连通分量:极大连通子图 无向图G 无向图G的三个连通分量 A B A B F G E F G E H I J I J H K L K L M M C D C D

  5. 有向图的连通性 路径:在有向图G=(V,E)中由顶点v经有向边至v’的顶点序列。 回路或环:第一个顶点和最后一个顶点相同的路径。 简单回路或简单环:除第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路。 连通:顶点v至v’之间有路径存在 强连通图:有向图G的任意两点之间都是连通的,则称G是强连通图。 强连通分量:极大连通子图 A B A B C D C D 有向图G的两个强连通分量 有向图G

  6. A B E H M C D 生成树:极小连通子图。包含图的所有n个结点,但只含图的n-1条边。在生成树中添加一条边之后,必定会形成回路或环。 无向图G的生成树 无向图G A B E H M C D

  7. 完 全 图:有 n(n-1)/2 条边的无向图。其中n是结点个数。 有向完全图:有 n(n-1)条边的有向图。其中n是结点个数。 边的权值:边有权的图称之为网。 邻接点: 无向图结点的度 有向图结点的出度和入度 图的其它术语 无向图G1 有向图G2 A B A B E H M C D C D

  8. 7.2 图的存储结构 • 图的常用存储形式: • 邻接矩阵和加权邻接矩阵 • 邻接表 1、邻接矩阵和加权邻接矩阵(labeled adjacency matrix) 无权值的有向图的邻接矩阵 设有向图有n个结点,则用n行n列矩阵A表示有向图; 如果i至j有一条弧,则A[i,j] =1;否则,A[i,j]=0 注意: A[i,i]=0。 出度:i行之和;入度:j列之和。 A B 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 表示成右图矩阵 C D

  9. 无权值的无向图的邻接矩阵 设无向图有n个结点,则用n行n列的矩阵A表示该无向图; 如果i至j有一条边,则A[i,j]=1 ; 否则,A[i,j]=0 注意:A[i,i ]= 0。 i结点的度: i行或i列之和。 为对称矩阵。 A B 0 1 1 0 0 1 0 0 1 1 1 0 0 0 1 0 1 0 0 1 0 1 1 1 0 表示成右图矩阵 E C D

  10. 1 2 表示成右图矩阵 ∞a b ∞ ∞ ∞ ∞ b ∞ ∞ ∞ b a ∞ a ∞ b a b 3 4 a 图的加权邻接矩阵 设图有n个顶点,则用n行n列的矩阵A表示该图; 如果i至j有一条边(弧)且它的权值为w。则 A[i,j]=w ;否则,A[i,j]= ∞ (或其它标志); a b

  11. 图的建立:图顶点号从1开始计,数组下标按C/C++习惯从0计算图的建立:图顶点号从1开始计,数组下标按C/C++习惯从0计算 #define MAXINT (1<<sizeof(int)*8-1)-1 CreateGraph(a[][VexNuM],e) // VexNuM-图的顶点数,e-边(弧)数 { for(i=0;i<VexNuM;i++) for(j=0;j<VexNuM;j++) a[i][j]= MAXINT; for(k=1;k<=e;k++) { cin>>I>>j>>w;//读入顶点号i,j和边上权w a[i-1][j-1]=w; a[j-1][i-1]=w;//无向图 } }

  12. data firstarc 2、邻接表 设图具有 n 个结点,则用顶点数组表、边(弧)表表示该有向图或无向图。 顶点数组表:用数组存放所有的顶点。数组大小为图顶点数n。 边表(边结点表):每条边用一个结点进行表示。同一个结点的所有的边形成它的边结点单链表。 数组顶点表中的分量的形式: VNode: data:结点的数据域,保存结点的数据值(比如顶点号)。 firstarc:结点的指针域,给出自该顶点出发的的第一条边(弧)的边结点的地址。

  13. adjvex nextarc info 边表中的结点的形式 ArcNode: adjvex:结点的数据域,保存结点的数据(比如顶点号)。 nextvex:结点的指针域,给出该结点的下一结点(边)的地址。 info:边结点的数据域,保存边的 权值等。如不是网,此部分可省去。

  14. 2 4 1 2 2 3 1 2 3 3 4 1 ^ ^ ^ ^ 3 1 3 4 2 5 4 1 ^ 有向图 G1 1 2 0 1 2 3 adj 0 1 2 3 4 3 4 2 5 5 5 5 ^ ^ ^ ^ 无向图 G2 1 2 5 3 4 实例: adj

  15. 4 1 3 3 ^ ^ ^ 4 1 3 adj 0 1 2 3 2 1 ^ 逆邻接表——对有向图而言 有向图 G1 1 2 3 4

  16. 有向图邻接表建立 void Create(adj,n,e) //adj:邻接表表头数组, n个顶点,e条弧 { for(i=0;i<n;i++) { adj[i].data=i+1; adj[i].firstarc=NULL;} for(i=1;i<=e;i++) { cin>>u>>v;//输入一条弧<u,v> p =new ArcNode; p->adjvex=v; p->nextarc=adj[u-1].firstarc; adj[u-1].firstarc=p; } } 思考:若为无向图? 逆邻接表 作业:有向图中(1)增加一条弧 Addarc(adj,u,v) (2) 删除一条弧 Delarc(adj,u,v)

  17. 7.3 图的遍历 遍历:图中顶点访问一次且仅一次。 因为一个顶点可以和其它的任何顶点相邻接,为了避免对一个顶点的重复访问,必须对访问过的顶点加以标记。由于顶点的邻接次序是任意的,因此遍历可能有多种可能。 • 图的二种常见的遍历形式: • 深度优先搜索 • 广度优先搜索 1、深度优先(DFS)搜索 访问方式:从图中某顶点v出发: 1)访问顶点v;2)从v的未被访问的邻接点出发,继续对图进行深度优先遍历,若从某点出发所有邻接点都已访问过,退回前一个点继续上述过程,若退回开始点,结束。

  18. 1 5 5 5 5 5 8 8 8 8 8 8 8 8 8 2 3 7 4 5 6 7 6 6 6 6 6 6 6 6 6 6 6 3 3 3 3 3 3 3 3 3 3 3 8 4 1 1 1 1 1 1 1 1 1 1 1 2 2 2 3 1 3 1 1 3 6 8 7 5 2 4 搜索的实现(设图是连通的) 1、设置一个栈 A)图上任选一个点入栈,并访问 B)若栈空,转C),否则 从栈顶结点出发,选尚未访问的结点访问并进栈 若已无这样的点,则退栈 C)结束 栈空 1 1

  19. 使用的变量说明: visited[VNUM] ;//用于标识结点是否已被访问过 VNUM代表图的顶点数,访问过置1(初始所有visited[i]为0) void DFS(G,v)//从图G的顶点v开始搜索 { visited[v]=1; cout<<v<<endl; for(w=FirstAdjVex(G, v) ; w!=NULL ; w=NextAdjVex(G,v w)) if( !Visited[w]) DFS(G,w); } 此算法处理抽象的图G,当图为邻接表时,则可细化为:

  20. 1 2 3 4 5 6 7 8 adj 5 6 7 8 1 4 3 0 1 2 3 4 5 6 7 7 7 8 8 8 5 3 8 3 6 4 3 6 1 2 2 4 1 2 5 2 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } dfs(adj,1)

  21. 1 2 3 4 5 6 7 8 3 7 1 8 5 6 4 7 7 3 8 8 8 5 8 1 6 2 6 1 4 4 2 5 2 3 3 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2

  22. 1 2 3 4 5 6 7 8 3 1 5 4 8 7 6 7 8 8 8 5 7 3 8 6 2 4 1 5 2 4 6 3 3 2 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 1

  23. 1 2 3 4 5 6 7 8 3 1 5 4 8 7 6 7 8 8 8 5 7 3 8 6 2 4 1 2 5 4 6 3 3 2 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) 1

  24. 1 2 3 4 5 6 7 8 3 1 5 4 8 7 6 7 8 8 8 5 7 3 8 6 2 4 1 2 5 4 6 3 3 2 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) 1

  25. 1 2 3 4 5 6 7 8 3 1 5 4 8 7 6 8 8 5 7 7 8 3 8 6 2 4 1 2 5 4 6 3 3 2 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) 1 2

  26. 1 2 3 4 5 6 7 8 3 1 5 4 8 7 6 8 8 5 7 7 8 3 8 6 2 4 1 2 5 4 6 3 3 2 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) 1 2

  27. 1 2 3 4 5 6 7 8 3 1 5 4 8 7 6 8 8 5 7 7 8 3 8 6 2 4 5 2 1 4 6 3 3 2 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) 1 2

  28. 1 2 3 4 5 6 7 8 3 1 5 4 8 7 6 8 8 5 7 7 8 3 8 6 2 4 5 2 1 4 6 3 3 2 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) 1 2

  29. 1 2 3 4 5 6 7 8 3 1 5 4 8 7 6 8 3 8 7 5 8 7 8 6 2 4 5 2 1 2 6 1 3 3 4 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) 1 2 4

  30. 1 2 3 4 5 6 7 8 3 1 5 4 8 7 6 8 3 8 7 5 8 7 8 6 2 4 5 2 1 2 6 1 3 3 4 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) 1 2 4

  31. 1 2 3 4 5 6 7 8 3 1 5 4 8 7 6 8 3 8 7 5 8 7 8 6 2 4 5 2 1 2 6 1 3 3 4 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) 1 2 4

  32. 1 2 3 4 5 6 7 8 3 1 5 4 8 7 6 8 3 8 7 5 8 7 8 6 2 1 5 2 4 2 6 1 3 3 4 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) 1 2 4

  33. 1 2 3 4 5 6 7 8 3 1 5 4 8 7 6 8 3 8 7 5 8 7 8 6 2 1 5 2 4 2 6 1 3 3 4 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) 1 2 4

  34. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 3 8 8 5 8 7 8 5 6 2 4 1 2 3 2 6 4 3 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) 1 2 4 8

  35. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 3 8 8 5 8 7 8 5 6 2 4 1 2 3 2 6 4 3 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) 1 2 4 8

  36. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 3 8 8 5 8 7 8 5 6 2 4 1 2 3 2 6 4 3 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) 1 2 4 8

  37. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 3 8 8 5 8 7 8 5 6 2 4 1 2 3 2 6 4 3 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) dfs(adj,5) 1 2 4 8

  38. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 3 8 8 5 8 7 8 5 6 2 4 1 2 3 2 6 4 3 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) dfs(adj,5) 1 2 4 8

  39. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 7 8 8 5 8 3 8 5 6 2 4 1 2 3 4 6 2 1 3 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) dfs(adj,5) 1 2 4 8 5

  40. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 7 8 8 5 8 3 8 5 6 2 4 1 2 3 4 6 2 1 3 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) dfs(adj,5) 1 2 4 8 5

  41. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 7 8 8 5 8 3 8 5 6 2 4 1 2 3 4 6 2 1 3 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) dfs(adj,5) 1 2 4 8 5

  42. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 7 8 8 5 8 3 8 5 6 2 4 1 2 3 4 6 2 1 3 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) dfs(adj,5) 1 2 4 8 5

  43. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 3 8 8 5 8 7 8 5 6 2 4 1 2 3 2 6 4 3 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) 1 2 4 8 5

  44. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 3 8 8 5 8 7 8 5 6 2 4 1 2 3 2 6 4 3 1 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) 1 2 4 8 5

  45. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 7 8 8 5 8 3 8 5 6 2 4 1 2 3 4 6 2 1 3 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) dfs(adj,6) 1 2 4 8 5

  46. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 7 8 8 5 8 3 8 5 6 2 4 1 2 3 4 6 2 1 3 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) dfs(adj,6) 1 2 4 8 5

  47. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 7 8 8 5 8 3 8 5 6 2 4 1 2 3 4 6 2 1 3 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) dfs(adj,6) 1 2 4 8 5 6

  48. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 7 8 8 5 8 3 8 5 6 2 4 1 2 3 4 6 2 1 3 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) dfs(adj,6) 1 2 4 8 5 6

  49. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 7 8 8 5 8 3 8 5 6 2 4 1 2 3 4 6 1 3 2 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) dfs(adj,6) dfs(adj,3) 1 2 4 8 5 6

  50. 1 2 3 4 5 6 7 8 1 5 6 3 7 4 8 7 7 8 8 5 8 3 8 5 6 2 4 1 2 3 4 6 1 3 2 void dfs(adj,v) { visited[v-1]=1; cout<<v; for(p=adj[v-1].firstarc;p!=NULL;p=p->next) if(visited[p->adjvex-1]==0) dfs(adj,p->adjvex); } adj dfs(adj,1) 0 1 2 3 4 5 6 7 2 dfs(adj,2) dfs(adj,4) dfs(adj,8) dfs(adj,6) dfs(adj,3) 1 2 4 8 5 6

More Related