説明
コングコングの研究では、島の野蛮人は常に孤独な生活を送ったが、それらのすべてが島全体にされていない同じ部族に属していることを見つけ、野生の人々の部族は、常に自分の派閥、異なる部族を形成します頻繁に発生するとの戦い。しかし、それはすべての謎となっています - コングコングは、部族が分散正確にどのように知りませんでした。しかし、良いニュースは、コングコングが島のマップを得たことです。サベージは、ライブマークNサイトは、地図上(平面上の座標として見ることができます)。私たちは、野蛮人の部族で常に近く住んでいることを知っています。我々は2つの部族間の距離を置く、2つの集落の最寄りの部族の定義された距離です。コングコングも、意味のある情報を受け取った - これらは、総野蛮な部族Kに分かれています!これは本当に良いニュースです。コングコングの情報のすべての部族からより多くの情報を掘るしたいと考えています。直近の2つの部族に頼って、2つの部族間の距離を取得することができ、コングコングが部族の分割方法を見つけたい、部族部門のいずれかの方法でください:彼はこのようなアルゴリズムにしようとしていますそれは遠くかもしれません。例えば、左の後は良好な分割を示しているが、権利はありません。コングコングのプログラミングは、この問題を解決する助けてください。
入力
最初の行は、ライブとサベージ部族ポイントの数を表し、N及びK(1 <= N <= 1000,1 <K <= N)は、2つの整数を含みます。
次のN行、2つの正の整数xを含む各行は、Y、生活の座標は(0 <= X、Y <= 10000)点を説明
出力
出力ラインは、小数点以下2桁の正確な最高の分裂、最寄りの2つの部族、です。
サンプル入力
4 2
0 0
0 1
1 1
1 0
0 0
0 1
1 1
1 0
サンプル出力
1.00
ソリューション:欲プラス互いに素セット。出口が、0の出力に注意を払うために時間の競合がない場合に、各ポイントでもサイド、小さな点と優先順位の右側には、合併のたびは、n 1、== kは減少します。
/ * ************************************************ ************* 問題:1821 ユーザー:見知らぬ人 言語:C ++ 結果:受理 時間:180ミリ秒の メモリ:17092キロバイト ***************** ********************************************** * / の#include <ビット/ STDC ++ H> のconst int型 MAXN = 1005 。 INTのN、K、全て、 INT X [MAXN]、Y [MAXN]、FA [MAXN]。構造体のエッジ{ int型Uを、V。 ダブルワット; ブール演算子 <(constのエッジ&A)CONST { 戻り <W AW。 } }エッジ[MAXN * MAXN]。 INT(見つけるINT X){ 戻り [X] == X FAか?X:FA [X] = 見つける(FA [X])。 } int型のmain() { int型N、K。 scanf関数(" %d個の%のD "、&N&K)。 以下のために(int型私= 0 ; iがN <; Iは++ ) のscanf(" %D%D "、およびX [i]は、&Y [I])。 以下のために(int型私= 0 ; iがN <; I ++) のための(INT J = 0 ; J <I、J ++ ) { ダブル DIS =のSQRT((X [I] -x [J])*(X [I] -x [J])+(Y [I] - Y [J])*(Y [I] - Y [J]))。 エッジ【全て ++] = {I、J、DIS}。 } のstd ::ソート(エッジ、エッジ + すべて); 以下のために(int型 i = 0 ; iがn <; iは++)FA [I] = I。 以下のために(int型 i = 0 ; I <すべてのI ++ ) { int型、U =エッジ[I] .U、V = エッジを[I] .V。 int型のp = Q =、(U)を見つけるのfind(V); もし(!P = Q){ 場合(N == K){ のprintf(" %.2fする\ n " 、エッジ[I] .W)。 破ります; } FA [Q] = P。 N - ; } } 戻り 0 。 }