图的遍历

[复制链接]
 楼主| phosphate 发表于 2019-9-15 16:56 | 显示全部楼层 |阅读模式
      图的遍历有两种遍历方式:深度优先遍历(depth-first search)和广度优先遍历(breadth-first search)。
1.深度优先遍历
   基本思想:首先从图中某个顶点v0出发,访问此顶点,然后依次从v0相邻的顶点出发深度优先遍历,直至图中所有与v0路径相通的顶点都被访问了;若此时尚有顶点未被访问,则从中选一个顶点作为起始点,重复上述过程,直到所有的顶点都被访问。可以看出深度优先遍历是一个递归的过程。
   如下图中的一个无向图
   
  其深度优先遍历得到的序列为:
  0->1->3->7->4->2->5->6

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| phosphate 发表于 2019-9-15 16:56 | 显示全部楼层
2.广度优先遍历

   基本思想:首先,从图的某个顶点v0出发,访问了v0之后,依次访问与v0相邻的未被访问的顶点,然后分别从这些顶点出发,广度优先遍历,直至所有的顶点都被访问完。

   如上面图中

   其广度优先遍历得到的序列为:

   0->1->2->3->4->5->6->7
 楼主| phosphate 发表于 2019-9-15 16:57 | 显示全部楼层
实现代码

  1. #include<iostream>
  2. #include<queue>
  3. #include<stack>
  4. #include<stdlib.h>
  5. #define MAX 100
  6. using namespace std;

  7. typedef struct
  8. {
  9.     int edges[MAX][MAX];    //邻接矩阵
  10.     int n;                  //顶点数
  11.     int e;                  //边数
  12. }MGraph;

  13. bool visited[MAX];          //标记顶点是否被访问过

  14. void creatMGraph(MGraph &G)    //用引用作参数
  15. {
  16.     int i,j;
  17.     int s,t;                 //存储顶点编号
  18.     int v;                   //存储边的权值
  19.     for(i=0;i<G.n;i++)       //初始化
  20.     {
  21.         for(j=0;j<G.n;j++)
  22.         {
  23.             G.edges[i][j]=0;
  24.         }
  25.         visited[i]=false;
  26.     }
  27.     for(i=0;i<G.e;i++)      //对矩阵相邻的边赋权值
  28.     {
  29.         scanf("%d %d %d",&s,&t,&v);   //输入边的顶点编号以及权值
  30.         G.edges[s][t]=v;
  31.     }
  32. }

  33. void DFS(MGraph G,int v)      //深度优先搜索
  34. {
  35.     int i;
  36.     printf("%d ",v);          //访问结点v
  37.     visited[v]=true;
  38.     for(i=0;i<G.n;i++)       //访问与v相邻的未被访问过的结点
  39.     {
  40.         if(G.edges[v][i]!=0&&visited[i]==false)
  41.         {
  42.             DFS(G,i);
  43.         }
  44.     }
  45. }

  46. void DFS1(MGraph G,int v)   //非递归实现
  47. {
  48.     stack<int> s;
  49.     printf("%d ",v);        //访问初始结点
  50.     visited[v]=true;
  51.     s.push(v);              //入栈
  52.     while(!s.empty())
  53.     {
  54.         int i,j;
  55.         i=s.top();          //取栈顶顶点
  56.         for(j=0;j<G.n;j++)  //访问与顶点i相邻的顶点
  57.         {
  58.             if(G.edges[i][j]!=0&&visited[j]==false)
  59.             {
  60.                 printf("%d ",j);     //访问
  61.                 visited[j]=true;
  62.                 s.push(j);           //访问完后入栈
  63.                 break;               //找到一个相邻未访问的顶点,访问之后则跳出循环
  64.             }
  65.         }
  66.         if(j==G.n)                   //如果与i相邻的顶点都被访问过,则将顶点i出栈
  67.             s.pop();
  68.     }
  69. }

  70. void BFS(MGraph G,int v)      //广度优先搜索
  71. {
  72.     queue<int> Q;             //STL模板中的queue
  73.     printf("%d ",v);
  74.     visited[v]=true;
  75.     Q.push(v);
  76.     while(!Q.empty())
  77.     {
  78.         int i,j;
  79.         i=Q.front();         //取队首顶点
  80.         Q.pop();
  81.         for(j=0;j<G.n;j++)   //广度遍历
  82.         {
  83.             if(G.edges[i][j]!=0&&visited[j]==false)
  84.             {
  85.                 printf("%d ",j);
  86.                 visited[j]=true;
  87.                 Q.push(j);
  88.             }
  89.         }
  90.     }
  91. }

  92. int main(void)
  93. {
  94.     int n,e;    //建立的图的顶点数和边数
  95.     while(scanf("%d %d",&n,&e)==2&&n>0)
  96.     {
  97.         MGraph G;
  98.         G.n=n;
  99.         G.e=e;
  100.         creatMGraph(G);
  101.         DFS(G,0);
  102.         printf("\n");
  103.     //    DFS1(G,0);
  104.     //    printf("\n");
  105.     //    BFS(G,0);
  106.     //    printf("\n");
  107.     }
  108.     return 0;
  109. }
 楼主| phosphate 发表于 2019-9-15 16:57 | 显示全部楼层
作者:Matrix海子
    
出处:http://www.cnblogs.com/dolphin0520/
    
本博客中未标明转载的**归作者Matrix海子和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在**页面明显位置给出原文连接,否则保留追究法律责任的权利。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

393

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

32

主题

393

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部