UVA 534 Frogger 【最小瓶颈树】

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=475

题意:求点1到2所有路径上最大边的最小值。

解法:Kruskal按边值排序。直到1,2联通。

代码:

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <queue>
#include <math.h>

using namespace std;

const int MAXN = 410000;//点
const int MAXM = 410000;//边

struct Edge
{
    int u, v;
    double w;
}edge[MAXM];


bool cmp(Edge a, Edge b)
{
    return a.w < b.w;
}

int tol;

void addedge(int u, int v, double w)
{
    edge[tol].u = u;
    edge[tol].v = v;
    edge[tol++].w = w;
}

int f[MAXN];//并查集使用
int find(int x)
{
    if (f[x] == -1) return x;
    else return f[x] = find(f[x]);
}

struct node
{
    int x, y;
}pos[MAXN];

double get_dis(node a, node b)
{
    int x = a.x - b.x;
    int y = a.y - b.y;
    return sqrt(x*x + y*y);
}

int main()
{
    int cases = 1;
    int n;
    while (~scanf("%d", &n) && n)
    {
        tol = 0;
        memset(f, -1, sizeof(-1));
        for (int i = 0; i < n; i++)
        {
            scanf("%d %d", &pos[i].x, &pos[i].y);
            for (int j = 0; j < i; j++)
                addedge(i, j, get_dis(pos[i], pos[j]));
        }
        sort(edge, edge + tol, cmp);
        for (int i = 0; i < tol; i++)
        {
            int u = edge[i].u;
            int v = edge[i].v;
            int t1 = find(u);
            int t2 = find(v);
            if (t1 != t2) f[t1] = t2;
            if (find(1) == find(0))
            {
                printf("Scenario #%d\nFrog Distance = %.3lf\n\n", cases++, edge[i].w);
                break;
            }
        }
    }
    return 0;
}

你可能感兴趣的:(UVA 534 Frogger 【最小瓶颈树】)