POJ 2253 Frogger

来源:互联网 发布:javascript 设置css 编辑:程序博客网 时间:2024/06/10 00:36

题意:输入n(石头个数),再输入n个石头的坐标,求第一个石头到最后一个石头的最小生成树的总权值。

思路:Kruskal算法,这道题参考网上代码

 1 2 3 4 5 6 7 8 91011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>using namespace std;typedef long long ll;const int N = 300;const int M = 40005;const int INF = 0x3f3f3f3f;struct Node{    int x, y;    double len;}q[M];int fa[M];int n, cnt;double X[N], Y[N];void init() {    cnt = 0;    for (int i = 0; i < M; i++) fa[i] = i;    memset(X, 0, sizeof(X));    memset(Y, 0, sizeof(Y));}int find(int x) {    return x == fa[x] ? x : fa[x] = find(fa[x]);}double getlen(int a, int b) {    return sqrt((X[a] - X[b]) * (X[a] - X[b]) + (Y[a] - Y[b]) * (Y[a] - Y[b]));}int cmp(Node x, Node y) {    return x.len < y.len;}void input() {    for (int i = 0; i < n; i++) {        scanf("%lf %lf", &X[i], &Y[i]);    }    for (int i = 0; i < n; i++) {        for (int j = 0; j < n; j++) {            if (i == j) continue;            q[cnt].x = i;            q[cnt].y = j;            q[cnt++].len = getlen(i, j);        }    }}double kruskal() {    sort(q, q + cnt, cmp);    double ans = 0;    for (int i = 0; i < cnt; i++) {        int x = find(q[i].x), y = find(q[i].y);        if (x != y) {            fa[x] = y;            if (find(0) == find(1)) {                ans = q[i].len;                break;            }        }    }    return ans;}int main() {    int Case = 1;    while (scanf("%d", &n) != EOF, n) {        printf("Scenario #%d\n", Case++);        init();        input();        printf("Frog Distance = ");        printf("%.3f\n\n", kruskal());    }    return 0;}

0 0