数据结构 有向图的非递归遍历

Posted 可是我不配

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 有向图的非递归遍历相关的知识,希望对你有一定的参考价值。

用邻接表存图

输入图之后输入源点start

用队列实现bfs 用栈实现dfs

 

  1 #include<cstdio>
  2 #include<vector>
  3 #include<cstring>
  4 #include<queue>
  5 #include<stack>
  6 using namespace std;
  7 
  8 const int maxn=1e3+10;
  9 
 10 int n,m;
 11 
 12 struct picture
 13 {
 14     int node[maxn];
 15     vector<int>edge[maxn];
 16     void addedge(int a,int b) //向图中加一条a到b的边
 17     {
 18         edge[a].push_back(b);
 19     }
 20 };
 21 
 22 
 23 
 24 void bfs(picture map,int start) //广搜遍历图
 25 {
 26     queue<int>ans,ha;
 27     int vis[maxn];
 28     memset(vis,0,sizeof(vis));
 29     ha.push(start);
 30     ans.push(start);
 31     vis[start]=1;
 32     while(!ha.empty()) //广度遍历
 33     {
 34         int point=ha.front();
 35         ha.pop();
 36         for(int i=0;i<map.edge[point].size();i++)
 37         { //遍历point上的每一条边
 38             int x=map.edge[point][i];
 39             if(!vis[x])
 40             {
 41                 ha.push(x);
 42                 ans.push(x);
 43                 vis[x]=1;
 44             }
 45         }
 46     }
 47     while(!ans.empty())
 48     {
 49         printf("%d ",ans.front());
 50         ans.pop();
 51     }
 52     printf("\n");
 53 }
 54 
 55 void dfs(picture map,int start) //深度遍历图
 56 {
 57     queue<int>ans;
 58     stack<int>haha;
 59     vector<int>vis[maxn];
 60     for(int i=1;i<=n;i++) //初始化邻接表vis
 61     {
 62         int _size=map.edge[i].size();
 63         while(_size--)
 64         {
 65             vis[i].push_back(0);
 66         }
 67     }
 68     haha.push(start);
 69     ans.push(start);
 70     while(!haha.empty()) //深搜
 71     {
 72         int x=-1;
 73         int point=haha.top();
 74         int _size=map.edge[point].size();
 75         for(int i=0;i<_size;i++) //遍历每一条边
 76         {
 77             int tmp=map.edge[point][i];
 78             if(!vis[point][i]) //如果point的第i条边没有被访问过
 79             {
 80                 vis[point][i]=1;
 81                 x=tmp;
 82                 ans.push(x);
 83                 haha.push(x);
 84                 break;
 85             }
 86         }
 87         if(x==-1) //如果point的所有边都被访问过
 88         {
 89             haha.pop();
 90         }
 91     }
 92     while(!ans.empty())
 93     {
 94         printf("%d ",ans.front());
 95         ans.pop();
 96     }
 97     printf("\n");
 98 }
 99 
100 int main()
101 {
102     while(~scanf("%d%d",&n,&m)) //输入一个n个点m条边的图
103     {
104         picture map;
105         for(int i=0; i<m; i++) //向图中加入m条边
106         {
107             int a,b;
108             scanf("%d%d",&a,&b);
109             map.addedge(a,b);
110         }
111         int start; 
112         scanf("%d",&start); //输入源点
113         printf("dfs:\n");
114         dfs(map,start);
115         printf("bfs:\n");
116         bfs(map,start);
117     }
118     return 0;
119 }
120 /*
121 
122 7 6
123 1 2
124 1 3
125 2 4
126 2 5
127 3 6
128 3 7
129 1
130 
131           1
132        2    3
133      4  5  6  7
134 
135 */

 

以上是关于数据结构 有向图的非递归遍历的主要内容,如果未能解决你的问题,请参考以下文章

求高手给个遍历算法

转更简单的非递归遍历二叉树的方法

最简方式实现二叉树的非递归遍历

二叉树遍历的非递归算法

《数据结构》遍历二叉树的非递归算法的疑问。

树的非递归遍历