遍历图-深度优先

基本思想:

  1:从图中某个顶点Vi出发,先访问Vi

  2:选择一个与刚访问的顶点Vi相邻且未访问过的顶点,然后访问该顶点。接而以该顶点为新顶点,重复本步骤,知道当前顶点没有未访问的邻接点为止。

  3:返回前一个访问过的且仍有未访问的邻接点的顶点,找出并访问该顶点的下一个未访问的邻接点,重复执行步骤2

这种搜索方式类似于树的先序遍历,是树的先序遍历的推广

以邻接表为存储结构的深度优先搜索遍历算法:

 1 //以邻接表为存储结构的深度优先搜索遍历算法
 2 
 3 #include<stdio.h>
 4 #include<malloc.h>
 5 #define MAX_VER 100                                         //最大顶点数100
 6 
 7 typedef struct node{                                        //定义表节点 
 8     int adjvex;                                             //邻接顶点域 
 9     struct node *next;                                      //指向下一个邻接顶点的指针域
10     //char info;                                            //若为网图,表示边上信息,应增加一个数据域info 
11 }Arcnode; 
12 typedef struct vexnode{                                     //定义头节点 
13     int vertex;                                             //顶点域 
14     Arcnode *firstarc;                                      //边表头指针 
15 }Vexnode;                                                   //Vexnode是以邻接表的形式存储图类型 
16 
17 Vexnode adjlist[MAX_VER];                                   //定义头节点数组
18 
19 int creatadlist()                                           //建立邻接表 
20 {
21     Arcnode *ptr;
22     int arcnum,vexnum,k,v1,v2;
23     printf("请输入顶点数与边数:\n");
24     scanf("%d %d",&vexnum,&arcnum);
25     for(k = 1;k <= vexnum;k++)
26         adjlist[k].firstarc = 0;
27     for(k = 0;k < arcnum;k++)                               //为adjlist数组的各元素分别创建各自的链表 
28     {
29         printf("v1,v2 = ");
30         scanf("%d %d",&v1,&v2);
31         ptr = (Arcnode *)malloc(sizeof(Arcnode));
32         ptr->adjvex = v2;
33         ptr->next = adjlist[v1].firstarc;
34         adjlist[v1].firstarc = ptr;
35                                                             //如果是有向图,下面四句话要删除 
36         ptr = (Arcnode *)malloc(sizeof(Arcnode)); 
37         ptr->adjvex = v1;
38         ptr->next = adjlist[v2].firstarc;
39         adjlist[v2].firstarc = ptr;
40     } 
41     
42     return vexnum;
43 } 
44 
45 int dfs(int v)
46 {
47     int w;
48     Arcnode *p;
49     p = adjlist[v].firstarc;
50     printf("%4d",v);                                        //输出访问顶点
51     adjlist[v].vertex = 1;                                 //顶点标志域置为1,表明已经访问过
52     while(p != NULL)
53     {
54         w = p->adjvex;
55         if(adjlist[w].vertex == 0)
56             dfs(w);                                        //如果该顶点未访问过则递归调用,从该顶点出发,沿着它的各邻接点向下搜索 
57         p = p->next;
58     } 
59     
60     return 0;
61 }
62 
63 int main()
64 {
65     int n;
66     Arcnode *p;
67     n = creatadlist();                                      //建立邻接表并返回顶点个数 
68     
69     printf("所建图的邻接表为:\n");
70     for(int i = 1;i <= n;i++)
71     {
72         printf("%d==>",i);
73         p = adjlist[i].firstarc;
74         while(p != NULL)
75         {
76             printf("-- -->%d",p->adjvex);
77             p = p->next;
78         }
79         printf("\n"); 
80     }
81     printf("输入深度优先搜索的起始节点:\n");
82     scanf("%d",&n);
83     printf("图的深度优先搜索序列DFS:");
84     dfs(n);
85     
86     return 0;
87 } 
View Code

猜你喜欢

转载自www.cnblogs.com/mlblog27/p/9569692.html