zoukankan      html  css  js  c++  java
  • 图的深度优先遍历(邻接矩阵,递归,非递归)

    参考博客:图的深度优先遍历(递归、非递归;邻接表,邻接矩阵)

    本篇默认连通图,非连通情况会在邻接表处补上

    1.邻接矩阵的递归解法

    #include<stdio.h>
    #define MAX 100
    
    typedef struct
    {
        int e[MAX][MAX];
        int ves;
        int edge;
        int book[MAX];//标志判断是否有被访问过 
    }MGraph;
    
    void createMGraph(MGraph *G)
    {
        int i;
        int j;
        int start;
        int end;
    
        printf("please input the ves and edge:
    ");
        scanf("%d %d",&G->ves,&G->edge);
    //初始化
        for(i = 0; i < G->ves; i++)
        {
          for(j = 0; j < G->ves; j++)
            G->e[i][j] = 0;
          G->book[i] = 0;//没被访问过的结点置为0 
        }
    //创建邻接矩阵 
        printf("please input the (vi,vj)
    ");
        for(i = 0; i < G->edge; i++)
        {
           scanf("%d %d",&start,&end);
          G->e[start][end] = 1;
        }
    }
    
    void dfs(MGraph *G,int ves)
    {
        int i;
    
        G->book[ves] = 1;//被访问过的结点置为1 
        printf("%d ",ves);
    
        for(i = 0; i < G->ves; i++)
           if(G->e[ves][i] != 0 && G->book[i] == 0)
               dfs(G,i);
    } 
    
    int main()
    {
        MGraph G;
        createMGraph(&G);
        dfs(&G,0);
        return 0;
    }
    /*
    输入样例:
    8 18
    0 1
    0 2
    1 0
    1 3
    1 4
    2 0
    2 5
    2 6
    3 1
    3 7
    4 1
    4 7
    5 2
    5 6
    6 2
    6 5
    7 3
    7 4
    */ 

    2.邻接矩阵的非递归解法

    基本思想:

    • 初始化栈
    • 输出起始顶点,起始顶点改为“已访问”标志,将起始顶点进栈
    • 重复以下操作直至栈空:
      • 去栈顶元素顶点,找到未被访问的邻接结点W
      • 输出W,W改为“已访问”,将W进栈
      • 否则当前顶点退栈
    #include<stdio.h>
    #include<stack>
    #define MAX 100
    using namespace std;
    
    typedef struct
    {
        int e[MAX][MAX];
        int ves;
        int edge;
        int book[MAX];//标志判断是否有被访问过 
    }MGraph;
    
    void createMGraph(MGraph *G)
    {
        int i;
        int j;
        int start;
        int end;
    
        printf("please input the ves and edge:
    ");
        scanf("%d %d",&G->ves,&G->edge);
    //初始化
        for(i = 0; i < G->ves; i++)
        {
            for(j = 0; j < G->ves; j++)
                G->e[i][j] = 0;
            G->book[i] = 0;//没被访问过的结点置为0 
        }
    //创建邻接矩阵 
        printf("please input the (vi,vj)
    ");
        for(i = 0; i < G->edge; i++)
        {
            scanf("%d %d",&start,&end);
            G->e[start][end] = 1;
        }
    }
    
    void dfs(MGraph* G,int ves)
    {
       stack<int> s;//创建一个栈
       printf("%d ", ves);
    
       G->book[ves] = 1;//已经访问过结点ves了
       s.push(ves);//入栈
    
       while(!s.empty())
       {
           int data, i;
    
           data = s.top();//取top的顶点
           for(i = 0; i < G->ves; i++)
           {
               if(G->e[data][i] != 0 && G->book[i] != 1)
           {
               printf("%d ", i);
               G->book[i] = 1;
               s.push(i);
               break;//深度优先 
           }
           }
           if(i == G->ves)//data相邻的结点都访问结束了,就弹出data
           {
               s.pop();
           }
       }
    }
    
    int main()
    {
        MGraph G;
        createMGraph(&G);
        dfs(&G,0);
        return 0;
    }
    /*
    输入样例:
    8 18
    0 1
    0 2
    1 0
    1 3
    1 4
    2 0
    2 5
    2 6
    3 1
    3 7
    4 1
    4 7
    5 2
    5 6
    6 2
    6 5
    7 3
    7 4
    */ 

  • 相关阅读:
    mysql错误Error(1133): Can’t find any matching row in the use
    xtrbackup备份mysql
    配置Mysql审计
    Mysql:sql语句
    mysql基准测试与sysbench工具
    tomcat排错以及优化
    nginx反向代理
    Nginx
    服务器归分第一篇
    Android安装BusyBox(三星N7108)
  • 原文地址:https://www.cnblogs.com/exciting/p/10100185.html
Copyright © 2011-2022 走看看