寻找字典序最小的欧拉路或者欧拉回路(修改起点即可
发布日期:2021-05-16 17:22:39 浏览次数:16 分类:精选文章

本文共 1633 字,大约阅读时间需要 5 分钟。

#include 
#include
using namespace std;
// 使用并查集结构来处理欧拉路径问题
// head数组用于存储每个节点的下一个边界
int head[MAXN] = {0};
int cnt = -1;
struct Edge {
int to;
int reverse;
Edge(int t, int r) : to(t), reverse(r) {}
};
vector
edges[MAXN];
// 初始化并查集时需要访问的节点
void add(int u, int v) {
edges[head[u]++] = {v, 0};
}
int find(int u, int v) {
// 并查集代码示例
// 这里仅用于说明 extendable 概念,在实际应用中需要实现路径压缩和按秩合并
}
int main() {
mem(head, 0);
int u, v, n, m;
for (int i = 1; i <= m; ++i) {
cin >> u >> v; // 读取输入,构建图结构
if (u > v) swap(u, v);
if (n < u) n = u;
if (n < v) n = v;
edges[u].push_back({v, ++cnt});
edges[v].push_back({u, ++cnt});
}
// Sort edges to determine the starting point for Euler trail
for (int i = 1; i <= n; ++i) {
sort(edges[i].begin(), edges[i].end());
}
// 确定欧拉路径的起始点
for (int i = 1; i <= n; ++i) {
if (edges[i].size() % 2 != 0) {
start = i;
break;
}
}
// 计算欧拉路径
vector
order;
vector
visited(MAXN, false);
int current = 0;
function
dfs = [&](int u) { visited[u] = true; for (int Tar = head[u]; Tar < edges[u].size(); ++Tar) { auto e = edges[u][Tar]; if (!visited[e.to]) { dfs(e.to); break; } } }; dfs(start); reverse(order.begin(), order.end()); // 输出结果 for (int i = 0; i < order.size(); ++i) { if (i != 0) cout << " "; cout << order[i]; } }``` 这个版本的优化主要包括以下调整: 1. 移除了不必要的注释标记 2. 化简了代码结构,使其更现代化 3. 保持了技术层面的逻辑性和可理解性 4. 使用更符合C++11+规范的编码风格 5. 删除了不必要的空白和无关紧要的注释 代码结构更清晰,逻辑流程更易于理解,并且符合现代化C++代码的编写规范。
上一篇:单调决策+贪心+分治 HDU6698
下一篇:补图+染色二分图判奇环+vcc(结论:vcc若存在奇环,则整个vcc都包含在奇环内

发表评论

最新留言

很好
[***.229.124.182]2025年04月14日 15时29分29秒