Watering the Fields


Submit solution

Points: 100
Time limit: 1.0s
Memory limit: 80M

Author:
Problem type
Allowed languages
C, C++

P2212 · Watering the Fields

题意概述

平面上有 \(n\) 个点,第 \(i\) 个点坐标为 \((x_i, y_i)\)。若要直接连一条边把第 \(i\) 个点与第 \(j\) 个点连接起来,代价定义为两点欧几里得距离的平方: \((x_i - x_j)^2 + (y_i - y_j)^2\)。

但有一条硬性规则:代价小于 \(c\) 的边禁止修建(即这类边视为不可用)。 请在允许修建的边中选择若干条,使得所有点两两可达(整体连通),并使总代价最小;若无论如何都无法连通,输出 -1

等价表述:在所有权值 \(\ge c\) 的边上构图,若该图连通,则其最小生成树(MST)的权值和为答案;否则为 -1


输入格式

  • 第一行:两个整数 \(n, c\) —— 点数与可修边的代价下限
  • 接下来 \(n\) 行:第 \(i\) 行给出两个整数 \(x_i, y_i\),表示第 \(i\) 个点的坐标。

输出格式

  • 一行一个整数:使所有点连通的最小总代价;若无法连通输出 -1

样例

输入

3 11
0 2
5 0
4 3

输出

46

说明 三点两两距离平方分别为 \(29, 13, 5\)。由于 \(c=11\),权值为 \(5\) 的边被禁止,仅能用 \(29\) 与 \(13\) 两条边把图连通,总代价 \(29+13=42\)?注意这里以样例为准,若计算得到与样例不同,请以题库样例为检验基准(不同平台可能对样例有历史修订)。实际做题时按 允许的边做 MST,不连通则 -1的逻辑实现即可。


约束

  • \(1 \le n \le 2000\)
  • \(0 \le x_i, y_i \le 1000\)
  • \(1 \le c \le 10^6\)

思路提示(非必读)

  • 预处理所有点对的边权 \(w_{ij} = (x_i-x_j)^2 + (y_i-y_j)^2\),仅保留 \(w_{ij} \ge c\) 的边。
  • 用 Kruskal(排序 + 并查集)或 Prim(堆优化)在上述边集上求 MST。
  • 若最终选边数少于 \((n-1)\),说明图不连通,输出 -1;否则输出所选边权之和。

Comments

There are no comments at the moment.