1. #include <iostream>
  2. #include <algorithm>
  3. #include <stack>
  4. #include <vector>
  5. #include <set>
  6. #include <unordered_map>
  7. using namespace std;
  8. int n,min_n=600;
  9. unordered_map<int,multiset<int>> fence; //存栅栏边(multiset存多个值且自动升序)
  10. unordered_map<int,int> degree; //节点度数
  11. int main(){
  12. ios::sync_with_stdio(0);
  13. cin.tie(0);
  14. cin>>n;
  15. for(int i=0;i<n;i++){
  16. int x,y;
  17. cin>>x>>y;
  18. fence[x].insert(y);
  19. fence[y].insert(x);
  20. degree[x]++;
  21. degree[y]++;
  22. min_n=min(min_n,x); //起点
  23. min_n=min(min_n,y);
  24. }
  25. vector<int> odds; // 存奇度数
  26. for (auto it = degree.begin(); it != degree.end(); ++it) {
  27. if (it->second % 2 != 0) {
  28. odds.push_back(it->first);
  29. }
  30. }
  31. //数据保证图是连通的
  32. int start=min_n;
  33. if(!odds.empty()){
  34. start=min(odds[0],odds[1]); //可能图为欧拉回路也有可能就是欧拉路径
  35. }
  36. stack<int> skt;
  37. vector<int> path; //欧拉路径
  38. skt.push(start);
  39. while(!skt.empty()){
  40. int u=skt.top();
  41. if(!fence[u].empty()){
  42. int v=*fence[u].begin(); //每次采取最小节点路径
  43. fence[u].erase(fence[u].begin());
  44. fence[v].erase(fence[v].find(u));
  45. skt.push(v); //压栈
  46. }
  47. else{
  48. path.push_back(u);
  49. skt.pop();
  50. }
  51. }
  52. reverse(path.begin(),path.end()); //逆序
  53. for(auto i:path){
  54. cout<<i<<endl;
  55. }
  56. return 0;
  57. }
点赞(0)
 

0 分

0 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论