图遍历

时间:2020-04-21
本文章向大家介绍图遍历,主要包括图遍历使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

(1)深度优先

 1 #include <stdio.h>
 2 int book[101],sum = 0,n,e[101][101];
 3 void dfs(int cur)
 4 {
 5     int i;
 6     printf("%d",cur);
 7     sum++;
 8     if(sum == n)
 9     {
10         return;
11      } 
12     for(i = 1;i <= n;i++)
13     {
14         if(e[cur][i] == 1 && book[i] == 0)
15         {
16             book[i] = 1;
17             dfs(i);
18         }
19     }
20     return;//返回上一顶点 
21 }
22 
23 int main ()
24 {
25     int i,j,m,a,b;
26     scanf("%d %d",&n,&m);
27     for(i = 1;i <= n;i++)
28         for(j = 1;j <= n;j++)
29             if(i == j) e[i][j] = 0;
30             else e[i][j] = 99;
31     //读入顶点之间的边 
32     for(i = 1;i <= m;i++)
33     {
34         scanf("%d %d",&a,&b);
35         e[a][b] = 1;
36         e[b][a] = 1;//该图是无向图 
37     }
38     book[1] = 1;
39     dfs(1);
40     return 0;
41 }

广度优先

 1 #include <stdio.h>
 2 int main ()
 3 {
 4     int i,j,n,m,a,b,cur,book[101] = {0},e[101][101];
 5     int que[10001],head,tail;
 6     scanf("%d %d",&n,&m);
 7     for(i = 1;i <= n;i++)
 8         for(j = 1;j <= n;j++)
 9             if(i == j) e[i][j] = 0; 
10             else e[i][j] = 999999;
11     for(i = 1;i <= m;i++)
12     {
13         scanf("%d %d",&a,&b);
14         e[a][b] = 1;//对无向图需要这么做, 
15         e[b][a] = 1;
16     }
    //队列初始化
17 head = 1; 18 tail = 1; 19 que[tail] = 1; 20 tail++; 21 book[1] = 1; 22 while(head < tail) 23 { 24 cur = que[head];//cur是起始顶点 25 for(i = 1;i <= n;i++) 26 { 27 if(e[cur][i] == 1&&book[i] == 0) 28 { 29 que[tail] = i; 30 tail++; 31 book[i] = 1; 32 }
          //如果tail大于n,则表明所有顶点都已经被访问过
33 if(tail > n)//退出循环的条件 34 { 35 break; 36 } 37 } 38 head++;//从上一轮第一次扩展的点处继续扩展 39 } 40 for(i = 1;i <= n;i++) 41 printf("%d ",que[i]); 42 return 0; 43 }

原文地址:https://www.cnblogs.com/FutureSience/p/12746282.html