原题链接:骑马修栅栏(fence)
#include <iostream>
#include <algorithm>
#include <stack>
#include <vector>
#include <set>
#include <unordered_map>
using namespace std;
int n,min_n=600;
unordered_map<int,multiset<int>> fence; //存栅栏边(multiset存多个值且自动升序)
unordered_map<int,int> degree; //节点度数
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for(int i=0;i<n;i++){
int x,y;
cin>>x>>y;
fence[x].insert(y);
fence[y].insert(x);
degree[x]++;
degree[y]++;
min_n=min(min_n,x); //起点
min_n=min(min_n,y);
}
vector<int> odds; // 存奇度数
for (auto it = degree.begin(); it != degree.end(); ++it) {
if (it->second % 2 != 0) {
odds.push_back(it->first);
}
}
//数据保证图是连通的
int start=min_n;
if(!odds.empty()){
start=min(odds[0],odds[1]); //可能图为欧拉回路也有可能就是欧拉路径
}
stack<int> skt;
vector<int> path; //欧拉路径
skt.push(start);
while(!skt.empty()){
int u=skt.top();
if(!fence[u].empty()){
int v=*fence[u].begin(); //每次采取最小节点路径
fence[u].erase(fence[u].begin());
fence[v].erase(fence[v].find(u));
skt.push(v); //压栈
}
else{
path.push_back(u);
skt.pop();
}
}
reverse(path.begin(),path.end()); //逆序
for(auto i:path){
cout<<i<<endl;
}
return 0;
}
0 分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复