请生成这道题的c++代码:问题描述 平面上有n个城市,你可以在城市之间建造公路或者在城市内建造机场。公路相连的城市是连通的,同时有机场的两个城市是连通的。每修一公里公路费用是D,每造一个机场费用是C。输入所有城市坐标,求使所有城市连通的最小费用。 输入格式 第一行,包含一个整数n,表示城市的个数。 接下去n行,每行一个实数xi。再接下去n行:每行一个实数yi。第i个城市的坐标为(xi, yi)。 接下去两行,每行一个实数,分别为D和C。 输出格式 保留两位小数,为最终答案。样例输入 4 0 0 400 400 0 100 0 100 1.0 150.0 样例输出 500.00
时间: 2024-04-18 11:26:34 浏览: 159
以下是用C++编写的解决上述问题的代码:
```cpp
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <iomanip>
using namespace std;
struct City {
double x, y;
};
struct Edge {
int u, v;
double cost;
};
bool cmp(const Edge& a, const Edge& b) {
return a.cost < b.cost;
}
int findParent(vector<int>& parent, int x) {
if (parent[x] != x) {
parent[x] = findParent(parent, parent[x]);
}
return parent[x];
}
void unionSet(vector<int>& parent, int x, int y) {
int px = findParent(parent, x);
int py = findParent(parent, y);
if (px != py) {
parent[px] = py;
}
}
double calcDistance(const City& a, const City& b) {
return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
}
double minimumCost(vector<City>& cities, double D, double C) {
int n = cities.size();
vector<Edge> edges;
vector<int> parent(n);
for (int i = 0; i < n; i++) {
parent[i] = i;
for (int j = 0; j < i; j++) {
double distance = calcDistance(cities[i], cities[j]);
edges.push_back({i, j, distance * D});
}
edges.push_back({i, i, C});
}
sort(edges.begin(), edges.end(), cmp);
double totalCost = 0.0;
int count = 0;
for (const auto& edge : edges) {
if (findParent(parent, edge.u) != findParent(parent, edge.v)) {
unionSet(parent, edge.u, edge.v);
totalCost += edge.cost;
count++;
if (count == n - 1) {
break;
}
}
}
return totalCost;
}
int main() {
int n;
cin >> n;
vector<City> cities(n);
for (int i = 0; i < n; i++) {
cin >> cities[i].x;
}
for (int i = 0; i < n; i++) {
cin >> cities[i].y;
}
double D, C;
cin >> D >> C;
double result = minimumCost(cities, D, C);
cout << fixed << setprecision(2) << result << endl;
return 0;
}
```
这段代码首先定义了两个结构体 `City` 和 `Edge`,分别用于表示城市的坐标和边的信息。然后定义了一些辅助函数,如排序比较函数 `cmp`,查找父节点的函数 `findParent` 和合并集合的函数 `unionSet`。接下来,通过输入数据构建了所有城市之间的边,并按照边的权值从小到大排序。然后使用并查集算法计算最小生成树的最小费用,并输出结果。
希望能对你有所帮助!如果还有其他问题,请随时提问。
阅读全文