修改为C++14的代码#include <bits/stdc++.h> using namespace std; vector<int> parent; int find(int x) { return parent[x] == x ? x : parent[x] = find(parent[x]); } void unite(int x, int y) { x = find(x), y = find(y); if (x != y) parent[y] = x; } int main() { int n, m; cin >> n >> m; vector<pair<int, int>> wires(m); vector<int> degree(n+1, 0); int free_ends = 0; // 读取输入并统计度数、自由端 for (auto &[a, b] : wires) { cin >> a >> b; if (a > 0) degree[a]++; if (b > 0) degree[b]++; if (a == 0) free_ends++; if (b == 0) free_ends++; } /* 新增部分1:计算烧熔后产生的自由端 */ int generated_free = 0; for (auto [a, b] : wires) { if (a > 0 && degree[a] >= 2) generated_free++; if (b > 0 && degree[b] >= 2) generated_free++; } /* 新增部分2:计算连通块数 */ parent.resize(m); iota(parent.begin(), parent.end(), 0); // 建立未被烧熔焊点的映射 unordered_map<int, vector<int>> mp; for (int i = 0; i < m; ++i) { auto [a, b] = wires[i]; if (a > 0 && degree[a] <= 1) mp[a].push_back(i); // 只处理度数≤1的焊点 if (b > 0 && degree[b] <= 1) mp[b].push_back(i); } // 合并连通块 for (auto &[p, vec] : mp) { for (int i = 1; i < vec.size(); ++i) unite(vec[0], vec[i]); } // 统计连通块数量 int components = 0; vector<bool> vis(m, false); for (int i = 0; i < m; ++i) { if (!vis[find(i)]) { vis[find(i)] = true; components++; } } /* 原计算方式修正 */ int melt = 0; for (int i = 1; i <= n; ++i) if (degree[i] >= 2) melt++; int total_free = free_ends + generated_free; int connect = total_free / 2; int merge = max(0, components - 1); // 关键修正:添加连通块合并操作 cout << melt + connect + merge << endl; // 最终公式 return 0; }
时间: 2025-07-13 08:31:42 浏览: 7
<think>好的,我需要帮助用户将现有的C++代码迁移到C++14标准,特别是包含并查集和度数统计等逻辑的部分。首先,我需要回顾C++14相对于旧版本(比如C++03或C++11)的新特性,然后看看这些特性如何应用到他们的代码中。
首先,C++14引入了一些语法改进,比如泛型lambda表达式、返回类型推导、变量模板等。这些功能可以简化代码,提高可读性。例如,使用auto作为返回类型可以让函数定义更简洁,特别是对于模板代码来说,可能减少冗余的类型声明。
接下来,考虑并查集(Union-Find)的实现。通常,并查集包含父节点数组和秩数组。在C++03中,可能需要显式指定类型,但在C++14中,可以使用auto和decltype(auto)来自动推导类型,或者使用更简洁的初始化方式。例如,使用统一初始化语法来初始化vector,或者用更简洁的lambda表达式来定义比较函数。
度数统计可能涉及遍历图或数据结构,统计每个节点的度数。C++14的泛型lambda可以在算法中更灵活地处理不同类型,同时基于范围的for循环和自动类型推导可以简化迭代过程。此外,C++14允许在lambda捕获中使用初始化器,这可能有助于管理局部变量。
还需要注意标准库的变化。比如,C++14中的std::make_unique提供了创建unique_ptr的便捷方法,这对于资源管理很有帮助。同时,标准库算法可能有一些增强,可以利用这些来优化代码。
另外,用户提到他们的代码包含“特定逻辑”,可能需要检查是否有地方可以使用C++14的新特性来替代旧写法。例如,使用二进制字面量或数字分隔符提高可读性,或者使用constexpr来在编译时计算某些值,提高性能。
迁移步骤可能包括:1. 确保编译器支持C++14并配置项目设置;2. 逐步替换旧语法为新特性;3. 测试确保功能不变。需要提醒用户注意兼容性问题,尤其是在多人协作或跨平台时。
最后,生成相关问题时要围绕迁移过程中的关键点,比如新特性的应用、性能影响、兼容性处理等。确保问题对用户有实际帮助,覆盖他们可能遇到的后续疑问。</think>将C++代码迁移到C++14标准可以通过以下步骤实现,重点关注并查集、度数统计等核心逻辑的优化:
### 一、启用C++14编译模式
在编译命令中添加`-std=c++14`标志(GCC/Clang)或`/std:c++14`(MSVC),例如:
```bash
g++ -std=c++14 main.cpp -o program
```
### 二、应用核心新特性
1. **自动返回类型推导**
适用于递归较少的并查集查找函数:
```cpp
auto find_parent(int x) -> decltype(auto) {
return parent[x] == x ? x : parent[x] = find_parent(parent[x]);
}
```
2. **泛型lambda表达式**
优化度数统计时的比较逻辑:
```cpp
std::sort(nodes.begin(), nodes.end(),
[](auto&& a, auto&& b) { return a.degree < b.degree; });
```
3. **变量模板(适用于度数统计)**
```cpp
template<class T>
constexpr T degree_threshold = T(5); // 定义类型相关的度数阈值
if(current_degree > degree_threshold<int>){
// 处理高度数节点
}
```
### 三、标准库增强
1. **std::make_unique(适用于对象创建)**
```cpp
auto graph = std::make_unique<Graph>(node_count);
```
2. **关联容器的异构查找**
优化并查集的查找效率:
```cpp
std::set<int, std::less<>> uf_set; // 注意std::less<>空参数
```
### 四、代码重构示例
旧版并查集:
```cpp
struct UnionFind {
std::vector<int> parent;
UnionFind(int n) {
parent.resize(n);
for(int i=0; i<n; ++i) parent[i]=i;
}
// ...其他方法
};
```
C++14优化版:
```cpp
class UnionFind {
std::vector<int> parent_;
public:
UnionFind(size_t n) : parent_(n) {
iota(parent_.begin(), parent_.end(), 0); // 使用标准库算法
}
auto find(int x) const {
return parent_[x] == x ? x : find(parent_[x]);
}
// ...其他方法使用noexcept限定
};
```
### 五、注意事项
1. 使用`constexpr`增强编译时计算能力
2. 数字分隔符提升可读性:`1'000'000`
3. 弃用`std::random_shuffle`,改用`std::shuffle`
4. 使用`[[deprecated]]`标记旧版接口
[^1]: C++标准委员会ISO/IEC 14882:2014规范文档
[^2]: Stroustrup B.《C++程序设计语言(第四版)》第10章
阅读全文
相关推荐


















