【最短路/最小生成树】POJ 2253 Frogger

POJ 2253 Frogger

题意:给\(n\)个结点的坐标,两两之间均可连通。找出在所有从结点\(1\)到结点\(2\)的路径中,最大边的权值(距离)最小的那一条,输出这个权值(距离)。

思路:

POJ 1797 Heavy Transportation的镜像题……这里求的是最小生成树的最大边。

int n, m;
int p[maxn];
double x[maxn], y[maxn];

int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); }

struct Edge {
    double from, to;
    double dis;
    bool operator < (const Edge& t) const { return dis < t.dis; }
}Edges[maxn * maxn];

void solve() {
    for (int i = 0; i <= n; i++) p[i] = i;

    int num = 0;
    double ans = 0;
    for (int i = 1; i <= n; i++) cin >> x[i] >> y[i];
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            ++num;
            Edges[num].from = i;
            Edges[num].to = j;
            if(i==j){Edge[num].dis=0;}
            else  Edges[num].dis = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]));
        }
    }
    sort(Edges + 1, Edges + 1 + num);
    for(int i=1;i<=num;i++) {
        Edge& e = Edges[i];
        int nx = find(e.from);
        int ny = find(e.to);
        if (find(1) != find(2)) {
            ans = e.dis;
            p[nx] = ny;
        }
        else break;
    }
    printf("Frog Distance = %.3f\n\n", ans);
}

猜你喜欢

转载自www.cnblogs.com/streamazure/p/12942525.html