JZOJ 1244 修建道路

2022-08-23 06:30:15 字數 1680 閱讀 8682

description

farmer john最近得到了一些新的農場,他想新修一些道路使得他的所有農場可以經過原有的或是新修的道路互達(也就是說,從任乙個農場都可以經過一些首尾相連道路到達剩下的所有農場)。有些農場之間原本就有道路相連。所有n(1 <= n <= 1,000)個農場(用1..n順次編號)在地圖上都表示為座標為(x_i, y_i)的點(0 <= x_i <= 1,000,000;0 <= y_i <= 1,000,000),兩個農場間道路的長度自然就是代表它們的點之間的距離。現在farmer john也告訴了你農場間原有的m(1 <= m <= 1,000)條路分別連線了哪兩個農場,他希望你計算一下,為了使得所有農場連通,他所需建造道路的最小總長是多少。

input

* 第1行: 2個用空格隔開的整數:n 和 m

* 第2..n+1行: 第i+1行為2個用空格隔開的整數:x_i、y_i

* 第n+2..n+m+2行: 每行用2個以空格隔開的整數i、j描述了一條已有的道路,這條道路連線了農場i和農場j

output

* 第1行: 輸出使所有農場連通所需建設道路的最小總長,保留2位小數,不必做 任何額外的取整操作。為了避免精度誤差,計算農場間距離及答案時請使用64位實型變數

sample input

4 1

1 13 1

2 34 3

1 4

sample output

4.00

data constraint

hint

樣例說明:

fj選擇在農場1和農場2間建一條長度為2.00的道路,在農場3和農場4間建一條長度為2.00的道路。這樣,所建道路的總長為4.00,並且這是所有方案中道路總長最小的一種。

1 #include 2 #include 3 #include 4 #include 5 #include 6

#define ll long long

7using

namespace

std;

8structsb9

a[2001

];12

structa13

e[1000001

];16

int map[1001][1001

];17

double calc(int x1,int

x2)18

22int fa[1001

];23

bool cmp(a a,a b)

24int find(int x)

25int

main()

2634

int tot=0;35

for (int i=1,x,y;i<=m;i++)

3641

for (int i=1;i)

42for (int j=i+1;j<=n;j++)

4347 sort(e+1,e+1+tot,cmp);

48for (int i=1;i<=n;i++) fa[i]=i;

49double ans=0;50

int cnt=0;51

for (int i=1;i<=tot&&cnt1;i++)

5257 printf("

%.2f

",ans);

58return0;

59 }

JZOJ 1244 修建道路 最小生成樹

傳送門 給出n nn個點和已經建好的m mm條邊,求我們需要修建的最小代價使得n nn個點可以互相到達 正常最小生成樹隨便跑,對於已經修好的邊就直接在開始就放在乙個塊裡 include include include include include include include include d...

Jzoj4729 道路修建

給你乙個聯通無向圖,問你要修建幾條邊使得該圖是乙個邊雙連通圖 無比經典,肯定是乙個tarjan求橋,刪掉後縮點,變成一顆樹,看看有幾個葉子結點,葉子結點一對對連起來即可 include include include include using namespace std struct edge g...

JZOJ 3806 小X 的道路修建

因為一場不小的 y 省n 個城市之間的道路都損壞掉了,省長希望小x 將城市之間的道路重修一遍。很多城市之間的地基都被 破壞導致不能修路了,因此可供修建的道路只有m 條。因為施工隊伍有限,省長要求用盡量少的道路將所有的城市連通起來,這樣施工量就可以盡量少。不過,省長為了表示自己的公正無私,要求在滿足上...