[USACO14MAR]浇地Watering the Fields

Title Description

Due to a lack of rain, Farmer John wants to build an irrigation system tosend water between his N fields (1 <= N <= 2000).Each field i is described by a distinct point (xi, yi) in the 2D plane,

with 0 <= xi, yi <= 1000. The cost of building a water pipe between twofields i and j is equal to the squared Euclidean distance between them:(xi - xj)^2 + (yi - yj)^2

FJ would like to build a minimum-cost system of pipes so that all of hisfields are linked together -- so that water in any field can follow asequence of pipes to reach any other field.

Unfortunately, the contractor who is helping FJ install his irrigationsystem refuses to install any pipe unless its cost (squared Euclideanlength) is at least C (1 <= C <= 1,000,000).

Please help FJ compute the minimum amount he will need pay to connect all his fields with a network of pipes.

Farmer John wanted to build an irrigation system, gave his N (1 <=  N  <= 2000) block of fields and bottled water. Farm in a two-dimensional plane, the coordinates of the i-th block of farmland ( x_i  ,  y_i ) (0 <=  x_i  ,  y_i  <= 1000), in the fields i  and farmland j their cost is that the two pipe laying farmland Euclidean Reed square of the distance (x_i - x_j) ^ 2 + (y_i - y_j) ^ 2.

Farmer John hope we can pass all the water between the fields but also want to spend the least money. However, installers refuse to install water pipes cost of less than C (. 1 <=  C <= 1, 000,000).

John Please help farmers establish a minimum cost of irrigation network, if you can not establish your output -1.

Input and output formats

Input formats:

* Line 1: The integers N and C.

* Lines 2..1+N: Line i+1 contains the integers xi and yi.

Output formats:

* Line 1: The minimum cost of a network of pipes connecting the fields, or -1 if no such network can be built.

Sample input and output

Input Sample # 1: 
3 11
0 2
5 0
4 3
Output Sample # 1: 
46

Explanation

INPUT DETAILS:

There are 3 fields, at locations (0,2), (5,0), and (4,3). The contractor will only install pipes of cost at least 11.

OUTPUT DETAILS:

FJ cannot build a pipe between the fields at (4,3) and (5,0), since its cost would be only 10. He therefore builds a pipe between (0,2) and (5,0) at cost 29, and a pipe between (0,2) and (4,3) at cost 17.

Source: USACO 2014 March Contest, Silver

analysis:

This title is a bare minimum spanning tree, only need to calculate the cost between each two points, and determine the relationship between c, and then decide whether to raise edge, but note that the array is 2000 * 2000, rather than 2000, otherwise they will be RE.

CODE:

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 const int M=4000005;
 6 int n,c,tot,ans;
 7 int fa[M];
 8 int xcor[M],ycor[M];
 9 struct node{
10     int u,v,w;
11 }a[M];
12 int findr(int x){
13     if (fa[x]==x) return x;
14     return fa[x]=findr(fa[x]);
15 }
16 void merge(int x,int y){
17     int A=findr(x);
18     int B=findr(y);
19     if (fa[A]!=fa[B]) fa[B]=A;
20     return ;
21 }
22 bool cmp(node x,node y){return x.w<y.w;}
23 int main(){
24     cin>>n>>c;
25     for (int i=1;i<=n;i++) fa[i]=i;
26     for(int i=1;i<=n;i++) cin>>xcor[i]>>ycor[i];
27     for (int i=1;i<=n;i++){
28         for (int j=i+1;j<=n;j++){
29             int cost=(xcor[i]-xcor[j])*(xcor[i]-xcor[j])+(ycor[i]-ycor[j])*(ycor[i]-ycor[j]);
30             if (cost>=c){
31                 a[++tot].u=i;
32                 a[tot].v=j;
33                 a[tot].w=cost;
34             }
35         }
36     }
37     sort(a+1,a+tot+1,cmp);
38     int cnt=0;
39     for (int i=1;i<=tot;i++){
40         if (fa[findr(a[i].u)]!=fa[findr(a[i].v)]){
41             ans+=a[i].w;
42             merge(a[i].u,a[i].v);
43             cnt++;
44         }
45     }
46     if (cnt==n-1) cout<<ans<<endl;
47      else cout << - 1 << endl;
48      return  0 ;
49 }

 

Guess you like

Origin www.cnblogs.com/kanchuang/p/11177032.html