最小生成树不仅可以得到最小的权值之和,其最大边权为生成树中最大边权最小的。
*一道例题:
1:承包池塘的青蛙
查看 提交 统计 提问
总时间限制: 1000ms 内存限制: 128000kB
描述
某池塘有N片荷叶, M只青蛙, 青蛙喜欢在荷叶之间跳来跳去.
给出青蛙们的最大可跳跃的距离Ci, 以及荷叶的坐标, 当忽略荷叶的直径.如果两片荷叶A和B间的距离小于某只青蛙F的最大可跳跃距离时, 可认为青蛙F可以从A跳到B, 也可以从B跳到A.
求能够从任意荷叶出发, 仅通过跳跃就能到达其它任意荷叶的青蛙个数.
输入
第一行一个整数, 表示M(2<=M<=500)
第二行为M个整数, 依次表示Ci(每个整数值在1—1000之间)
第三行为一个整数, 表示N(2<=N<=1000)
第四行至第N+3行, 每行两个数, 分布表示N个荷叶的坐标(横纵坐标均为整数, 范围为:-10000–10000)
输出
输出只有一行, 即所求满足条件的青蛙只数.
样例输入
4
100 200 300 400
6
0 0
100 0
100 200
-100 -100
-200 0
200 200
样例输出
3
疑问在于:为什么最小生成树的最长边是青蛙跳跃距离的下限?
首先,青蛙要到达所有节点,生成的图一定是经过所有点的。
存在无数个这样的图,而决定青蛙能否成功的只有这张图的最长边;
该图可能有环也可能无环,而有环图可以删掉某些边变为无环图,最长边只可能变小了或不变->最长边下线必定会在无环图(生成树)中找到;
确定了路线一定为生成树,接下来讨论为何是最小生成树。
我们用反证法:存在最小生成树,最长边为e;假设存在一个一般生成树,最长边eb且eb
#include <iostream>
#include <queue>
#include <list>
#include <stdio.h>
#include <vector>
#include <stdlib.h>
#include <string.h>
using