【最短路/最小生成树】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);
}