当前位置:   article > 正文

图深度优先遍历_编写程序对给定的有向图(不一定连通)进行深度优先遍历,图中包含n个顶点,编号为0至

编写程序对给定的有向图(不一定连通)进行深度优先遍历,图中包含n个顶点,编号为0至

编写程序对给定的有向图(不一定连通)进行深度优先遍历,图中包含n个顶点,编号为0至n-1。本题限定在深度优先遍历过程中,如果同时出现多个待访问的顶点,则优先选择编号最小的一个进行访问,以顶点0为遍历起点。

输入格式:

输入第一行为两个整数n和e,分别表示图的顶点数和边数,其中n不超过20000,e不超过50。接下来e行表示每条边的信息,每行为两个整数a、b,表示该边的端点编号,但各边并非按端点编号顺序排列。

输出格式:

输出为一行整数,每个整数后一个空格,即该有向图的深度优先遍历结点序列。

输入样例1:

  1. 3 3
  2. 0 1
  3. 1 2
  4. 0 2

输出样例1:

0 1 2 

输入样例2:

  1. 4 4
  2. 0 2
  3. 0 1
  4. 1 2
  5. 3 0

输出样例2:

0 1 2 3 

 

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long int ll;
  4. const int N=20005;
  5. vector<int> a[N];
  6. int main(){
  7. int n,e,x,y;
  8. cin>>n>>e;
  9. for(int i=0;i<e;i++){
  10. cin>>x>>y;
  11. a[x].push_back(y);
  12. }
  13. for(int i=0;i<n;i++){
  14. sort(a[i].rbegin(),a[i].rend());
  15. }
  16. vector<int> v(n,0);
  17. stack<int> st;
  18. for(int i=0;i<n;i++){
  19. st.push(i);
  20. while(!st.empty()){
  21. int w=st.top();
  22. st.pop();
  23. if(!v[w]){
  24. cout<<w<<" ";
  25. v[w]=1;
  26. int sz=a[w].size();
  27. for(int j=0;j<sz;j++){
  28. if(!v[a[w][j]]) st.push(a[w][j]);
  29. }
  30. }
  31. }
  32. }
  33. return 0;
  34. }

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/891144
推荐阅读
相关标签
  

闽ICP备14008679号