迪杰斯塔拉算法的简单应用 #include<iostream> #include<cstdio> #include<math.h> #include<vector> #include<algorithm> using namespace std; int father[105]; struct node { int order; //用输入的序号来单独做标记 float x; float y; }; struct Edge { int a, b; float length; }; bool compare(Edge lhs, Edge rhs) { return lhs.length < rhs.length; } void Init(int n) { for (int i = 1; i <= n; i++) { father[i] = i; } } int Find(int x) { if (x != father[x]) father[x] = Find(father[x]); return father[x]; } void Union(int x, int y, float & total,float length) { x = Find(x); y = Find(y); if (x != y) { //将两个节点合并 father[y] = x; total = total + length; } } int main() { vector<node> vec1; vector<Edge> vec2; int n; cin >> n; Init(n); for (int i = 1; i <= n; i++) { node temp; cin >> temp.x >> temp.y; temp.order = i; vec1.push_back(temp); } for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { Edge edge; edge.a = vec1[i].order; edge.b = vec1[j].order; edge.length = sqrt((vec1[i].x - vec1[j].x) * (vec1[i].x - vec1[j].x) + (vec1[i].y - vec1[j].y) * (vec1[i].y - vec1[j].y)); vec2.push_back(edge); } } sort(vec2.begin(), vec2.end(), compare); float total = 0; for (int i = 0; i < n * (n - 1) / 2; i++) { Union(vec2[i].a, vec2[i].b, total, vec2[i].length); } printf("%.2f\n", total); return 0; }