hdu 1162 最小生成樹模板 Eddy's picture
阿新 • • 發佈:2018-12-20
題意:給出n個點,求n個點連線或者間接連線的最小距離。最小生成樹
兩個點!! 1.多組資料,接收到EOF (WA了好幾發) 2.注意double 好長時間沒寫題,簡單題都get不到點了。
#pragma GCC optimize(2) #include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<set> #include<vector> #include<string> #include<queue> #include<math.h> using namespace std; const int maxn = 500; const int inf = 0x3f3f3f3f; typedef long long ll; struct node { int x, y; double dist; }edge[maxn*maxn]; struct point { double x, y; }poin[maxn*maxn]; int f[maxn]; double dis(double a, double b, double c, double d) { double fa = c - a; double fb = d - b; return sqrt(fa * fa + fb * fb); } bool cmp(node &a, node &b) { return a.dist < b.dist; } int finda(int a) { if (a != f[a]) { return f[a] = finda(f[a]); } else { return a; } } int main() { //freopen("C://input.txt", "r", stdin); int n; while (scanf("%d", &n) != EOF) { int k = 0; double ans = 0; for (int i = 1; i <= n; i++) { scanf("%lf%lf", &poin[i].x, &poin[i].y); f[i] = i; } for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { edge[k].x = i; edge[k].y = j; edge[k++].dist = dis(poin[i].x, poin[i].y, poin[j].x, poin[j].y); } } sort(edge, edge + k, cmp); for (int i = 0; i < k; i++) { int fa = edge[i].x; int fb = edge[i].y; if (finda(fa) != finda(fb)) { ans += edge[i].dist; f[finda(fa)] = finda(fb); } } printf("%.2lf\n", ans); } return 0; }