トピックリンクします。https://vjudge.net/problem/POJ-3714
質問の意味:最短距離のために、2つの設定ポイントを考えます。
アイデア:1 * AF場合は、-1に設定の2 fは、その後、2点間の距離を見つけ、1の集合体であるfをもとに平面上の最も近い点は、私はFが付い訪問していないどのような条件を加え、距離BFを計算= -1、または製品は、INF 1が返された場合。そして、同じ他のhdoj1007に。
ACコード:
#include <cstdioを> する#include <アルゴリズム> の#include <cmath> の#include <cstdlib> 使用して 名前空間STD。 const int型 MAXN = 2E5 + 5 。 constの ダブル INF = 1e30。 INT T、N、CNT、ID [MAXN]。 構造体ノード{ int型X、Y、F。 } PT [MAXN]。 ブール 演算子 <(CONSTノードと、CONSTノード&B){ 場合(AX == BX)戻り AY < によって、 リターン斧< BX。 } BOOL CMP(INT A、INT B){ 戻り PT [A] .Y < PT [B] .Y。 } 二重 DIST(CONSTノードと、CONSTノード&B){ 場合(AF *のBFの== 1)戻りINF。 リターン SQRT(1.0 *(AX-BX)*(AX-BX)+ 1.0 *(AY-による)*(ay- )によります)。 } 二重 fenzhi(int型 L、INT R){ ダブル D = INF。 もし(L == R)戻りD。 もし(L + 1 == R)戻りDIST(PT [L]、PT [R])。 INT半ば=(L + R)>> 1 。 D =分(fenzhi(L、MID)、fenzhi(MID + 1 、R)); CNT = 0 ; INT T1、T2、L1 = L、R1 = 中間、MID1。 一方(L1 <= R1){ MID1 =(L1 + R1)>> 1 。 もし(PT [中間] .X-PT [MID1] .X <D)R t = mid1- 1 。 他の L1 = MID1 + 1 ; } T1 = L1。 L1 =ミッド+ 1、R1 =R; 一方(L1 <= R1){ MID1 =(L1 + R1)>> 1 。 もし(PT [MID1] .X-PT [中間] .X <D)L1 = MID1 + 1 。 他 R1 = mid1- 1 。 } T2 = R1。 以下のために(int型 I = T1と、私は= T2を<; ++ i)の ID [ ++ CNT] = I。 ソート(ID + 1、ID + CNT + 1 、CMP)。 以下のために(int型 i = 1 ; iは、CNTを<; ++ I) のために(int型 J = +1 ; J <= CNT &&(PT [ID [j]] Y-PT [ID [I]] Y <D。); ++ j)は 、D = 分(D、DIST(PT [ID [I]、 PT [ID [J])); リターンD; } int型のmain(){ scanf関数(" %のD "、&T)。 一方、(T-- ){ scanf関数(" %のD "、&N) 以下のために(int型 i = 1 ; iが= < 2 * N; ++ i)が{ scanf関数(" %D%D "、およびPT [I] .X、&PT [I] .Y)。 場合 PT [i]は式(I = Nを<)。; 他の PT [i]が.F = - 1 ; } ソート(PT + 1、PT + 1 + 2 *のN)。 printf(" %.3fする\ n "、fenzhi(1、2 *のN))。 } 戻り 0 。 }