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

用邻接表存图

输入图之后输入源点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 */
时间: 2024-10-05 21:28:16

数据结构 有向图的非递归遍历的相关文章

用邻接矩阵存储的有向图的非递归遍历

/************************************************** 有向图的非递归遍历, 程序假如图的强联通的 如果不是强联通简单修改即可. *************************************************/ #include <iostream> #include <cstdio> using namespace std; const int maxsize = 100; typedef struct sqst

数据结构——二叉树遍历之“递归与非递归遍历”

简述 二叉树的遍历分为先序遍历.中序遍历和后序遍历.如下图所示: 递归遍历 private void bianli1(List<Integer> list, TreeNode root) { // 先序遍历 if (root == null) { return; } list.add(root.val); bianli1(list, root.left); bianli1(list, root.right); } private void bianli2(List<Integer>

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树-- 编写函数实现:建立二叉树.中序递归遍历.借助栈实现中序非递归遍历.借助队列实现层次遍历.求高度.结点数.叶子数及交换左右子树. ("."表示空子树) #include<stdio.h> #include<stdlib.h> //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LChild;  struc

数据结构二叉树的递归与非递归遍历之 实现可编译(1)java

前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序遍历为例进行说明,中序遍历和后序遍历,以此类推! 二叉树递归与非递归遍历的区别,虽然递归遍历,跟容易读懂,代码量少,运算快,但是却容易出现溢出的问题,所以所以非递归遍历,在处理千万级的运算量时会先的很有用处. 二叉树的先序遍历:先访问根节点,再访问先后访问左右节点.如图: 二叉树的递归遍历之java

Java数据结构——二叉树的递归与非递归遍历(DFS)

二叉树的遍历分为递归遍历和非递归遍历 一.递归实现前.中.后序遍历Node.java: public class Node { private Object data; Node richild; Node lechild; public Object getData() { return data; } public void setData(Object data) { this.data = data; } public Node getRichild() { return richild

数据结构之二叉树篇卷三 -- 二叉树非递归遍历(With Java)

Nonrecursive Traversal of Binary Tree First I wanna talk about why should we use <code>Stack</code> to implement this algorithm. I think it is due to the FILO feature of Stack, and that really matters and makes sense when you get around with t

二叉树的非递归遍历--京东2015笔试回忆

题目回忆: C/C++研发试卷:偏重于数据结构的考察,编程题有2题+1题附加题: 1.输入整数n,求m,m>9,m中各个数位的乘积=n的最小整数;如n=36,m=49; 2.二叉树前序遍历的非递归实现(本文的总结) 3.求第n个数,这个序列满足(2^i)*(3^j)*(5^k),前7个为:2,3,4,5,6,8,10 .... 小题有基本的数据结构.程序运行结果.SQL题目. 4.删除表格用DROP命令,死锁产生的条件: 4.1互斥使用(资源独占) 一个资源每次只能给一个进程使用 4.2.不可强

史上最简明易懂非递归遍历二叉树算法

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 遍历二叉树的递归函数是体现了算法之美的高妙算法,思路清晰,代码简洁,读之赏心悦目.代码例如以下: 程序代码: void PreOrderTraverse_R(BiTree BT)//採用递归方式先序遍历二叉树BT { if(BT != NULL) { printf("%c", BT->data);//输出该结点(根结点) PreOrderTraverse_R(BT->lchi

【算法导论】二叉树的前中后序非递归遍历实现

二叉树的递归遍历实现起来比较简单,而且代码简洁:而非递归遍历则不那么简单,我们需要利用另一种数据结构---栈来实现.二叉树的遍历又可以分为前序.中序和后序三种,它们是按照根结点在遍历时的位置划分的,前序遍历则根结点先被遍历,中序则根结点在左右叶子节点之间被遍历,后序则是根结点最后被遍历.三种非递归遍历中,前序和中序都不是太复制,而后序遍历则相对较难. 一.前序遍历 我们这里前序遍历按照"根-左-右"的顺序来遍历.这里按照"递归--非递归"的次序来研究,之后的几种亦是