首页 > 代码库 > 数据结构 有向图的非递归遍历
数据结构 有向图的非递归遍历
用邻接表存图
输入图之后输入源点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 6123 1 2124 1 3125 2 4126 2 5127 3 6128 3 7129 1130 131 1132 2 3133 4 5 6 7134 135 */
数据结构 有向图的非递归遍历
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。