4.81k likes | 4.92k Views
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}
E N D
1、图的定义和术语 2、图的存储结构 3、图的遍历 4、图的连通性问题 5、有向无环图及其应用 6、最短路径1、图的定义和术语 2、图的存储结构 3、图的遍历 4、图的连通性问题 5、有向无环图及其应用 6、最短路径 第七章 图
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>}
有向图 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
无向图的连通性 路径:在无向图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
有向图的连通性 路径:在有向图G=(V,E)中由顶点v经有向边至v’的顶点序列。 回路或环:第一个顶点和最后一个顶点相同的路径。 简单回路或简单环:除第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路。 连通:顶点v至v’之间有路径存在 强连通图:有向图G的任意两点之间都是连通的,则称G是强连通图。 强连通分量:极大连通子图 A B A B C D C D 有向图G的两个强连通分量 有向图G
A B E H M C D 生成树:极小连通子图。包含图的所有n个结点,但只含图的n-1条边。在生成树中添加一条边之后,必定会形成回路或环。 无向图G的生成树 无向图G A B E H M C D
完 全 图:有 n(n-1)/2 条边的无向图。其中n是结点个数。 有向完全图:有 n(n-1)条边的有向图。其中n是结点个数。 边的权值:边有权的图称之为网。 邻接点: 无向图结点的度 有向图结点的出度和入度 图的其它术语 无向图G1 有向图G2 A B A B E H M C D C D
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
无权值的无向图的邻接矩阵 设无向图有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
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
图的建立:图顶点号从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;//无向图 } }
data firstarc 2、邻接表 设图具有 n 个结点,则用顶点数组表、边(弧)表表示该有向图或无向图。 顶点数组表:用数组存放所有的顶点。数组大小为图顶点数n。 边表(边结点表):每条边用一个结点进行表示。同一个结点的所有的边形成它的边结点单链表。 数组顶点表中的分量的形式: VNode: data:结点的数据域,保存结点的数据值(比如顶点号)。 firstarc:结点的指针域,给出自该顶点出发的的第一条边(弧)的边结点的地址。
adjvex nextarc info 边表中的结点的形式 ArcNode: adjvex:结点的数据域,保存结点的数据(比如顶点号)。 nextvex:结点的指针域,给出该结点的下一结点(边)的地址。 info:边结点的数据域,保存边的 权值等。如不是网,此部分可省去。
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
4 1 3 3 ^ ^ ^ 4 1 3 adj 0 1 2 3 2 1 ^ 逆邻接表——对有向图而言 有向图 G1 1 2 3 4
有向图邻接表建立 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)
7.3 图的遍历 遍历:图中顶点访问一次且仅一次。 因为一个顶点可以和其它的任何顶点相邻接,为了避免对一个顶点的重复访问,必须对访问过的顶点加以标记。由于顶点的邻接次序是任意的,因此遍历可能有多种可能。 • 图的二种常见的遍历形式: • 深度优先搜索 • 广度优先搜索 1、深度优先(DFS)搜索 访问方式:从图中某顶点v出发: 1)访问顶点v;2)从v的未被访问的邻接点出发,继续对图进行深度优先遍历,若从某点出发所有邻接点都已访问过,退回前一个点继续上述过程,若退回开始点,结束。
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
使用的变量说明: 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,当图为邻接表时,则可细化为:
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)
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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