JZOJ 1244道路

タイトル

説明

いくつかの新しいファームを持っファーマージョンは最近、彼があること(すべての道路の一部の最後の相互運用性に彼の農場は、既存または新規の道路の端を渡すことができるように新しい道路の一部を修復したい、どちらかの農場から通過することができます)農場のすべての残りの部分に達します。もともといくつかの農場間の道路に接続がありました。すべてのN(1 <= N <=千)ファーム(順次番号1..N有する)座標(X_I、Y_I)のマップとして表される点(0 <= X_I <= 1,000,000; 0 <= Y_I <= 1,000,000)と、2つのファームの性質との間の道路の長さは、その点間の距離を表します。今ファーマージョンはまた、すべてのファームの接続を行うために、彼はビルド道路に必要、彼はあなたが数学を行う期待している、2つの農場を接続した農道間の元Mを(1 <= M <=千)言いました最小の全体の長さです。
 

入力

* 1行目:NとM:スペースで区切られた整数と2
* + 1つのライン2..n:X_I、Y_I:2つのI + 1の整数の挙動は、スペースで区切られた
Nの* + 2。 .N + M + 2行:各ラインとの2 i、jは、既存の道路を記述する空間の整数で分離、農場および農業I Jを結ぶ道路

出力

*行1:すべてのファーム出力接続は、任意の付加的な丸め演算を実行することなく、道路工事、小数点以下2桁の最小合計長さを必要としました。精度エラーを回避するために、ファームと回答との間の距離を計算するときに実際の変数を64ビット使用
 

サンプル入力

4 1 
1 1 
3 1 
2 3 
4 3 
1 4

サンプル出力

4.00
 

データ制約

 
 

ヒント

サンプル説明:
FJ、4つの組み込み3つの農場や農道2.00の長さを2.00の長さは1と農道を構築するために、2つのファームを選択します。このようにして、4.00の全長の道路、これは道路の長さのすべてのプログラムの中で最小です。

 

分析

 

  • まず、木のそれは確かに接続されているグラフ
  • それは、最小スパニングツリーではありません
  • その後、我々は、割り当てられたいくつかの既存のエッジを置く0
  • ANSが不足しています

 

コード

1の#include <cmath>
 2の#include <cstdioを>
 3の#include <CStringの>
 4の#include <iostreamの>
 5の#include <アルゴリズム>
 6  の#define LL長い長い
 7  使って 名前空間STDを、
8  構造体SB
 9  {
 10      のint X、Y。
11 } [ 2001 ]。
12  構造体A
 13  {
 14      INT  からの、。ダブルのval;
15 } E [ 1000001 ]。
16  INT地図[ 1001 ] [ 1001 ]。
17  二重 CALC(int型 X1、INT X2)
 18  {
 19      ダブル ANS = SQRT((ダブル)([X1] .xa [X2] .X)*([X1] .xa [X2] .X)+(ダブル()[X1] .ya [×2] .Y)*([X1] .ya [×2] .Y));
20の     リターンANS;
21  }
 22  INT FA [ 1001 ]。
23  ブール CMP(A、B){ リターン a.val < b.val;}
 24  int型の検索(INT X){ リターン?X == FA [x]はx:FA [X] = 見つける(FA [X]);} 
 25  のint main()の
 26  {
 27      INT N、M。
28      のscanf(" %D%D "、&​​N、&M)。
29      のためにINT I = 1、XX、YY; I <= N; I ++ 30      {
 31          のscanf(" %D%D "、およびXX、&YY)。
32          A [i]は.X = XX。[I] .Y = YY。
33      }
 34      INT TOT = 0 35      のためのint型iは= 1、X、Yと、I <= M; I ++ 36      {
 37          のscanf(" %D%D "、およびX&Y)。
38の          E [++ TOT]。= X。E [TOT] .TO = Y。E [TOT] .val = 0 39          地図[X] [Y] = 1 40     }
 41 のためにINTは iは= 1 ; I <N; I ++ 42 のためのINT J = iは+ 1、J <= N; J ++ 43       {
 44 であれば(私== J ||地図[I] [J] == 1                          続け;
45の             E [++ TOT]。= I; E [TOT] .TO = J。E [TOT] .val = CALC(i、j)は、
46       }
 47      ソート(E + 1、E + 1回の + TOT、CMP)。
48 のためにINT iは= 1 ; iが<= N; I ++)FA [I] = I。
49のダブル ANS = 0 ;
50 INT CNT = 0 51 のためにINT iが= 1 ; I <= TOT && CNT <N- 1 ; I ++ 52     {
 53 INTは                               U =(E [i]を見つける。から)、V = 見つける(E [I] .TO)。
54          もし(U == v)を続けます55の          ANS + = E [I] .val、CNT ++、FA [U] = V。
56      }
 57      のprintf(" %の.2f " 、ANS)。
58      リターン 0 ;
59 }

 

おすすめ

転載: www.cnblogs.com/zjzjzj/p/11821097.html