bzoj 3479: [Usaco2014 Mar]Watering the Fields

3479: [Usaco2014 Mar]Watering the Fields

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 174  Solved: 97
[Submit][Status][Discuss]

Description

Due to a lack of rain, Farmer John wants to build an irrigation system to send 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 two fields 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 his fields are linked together -- so that water in any field can follow a sequence of pipes to reach any other field. Unfortunately, the contractor who is helping FJ install his irrigation system refuses to install any pipe unless its cost (squared Euclidean length) 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.

草坪上有N个水龙头,位于(xi,yi)

求将n个水龙头连通的最小费用。任意两个水龙头可以修剪水管,费用为欧几里得距离的平方。
修水管的人只愿意修费用大于等于c的水管。

Input

* Line 1: The integers N and C.

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

Output

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

Sample Input

3 11
0 2
5 0
4 3

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.

Sample Output

46
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.

HINT

Source

Silver 译文By Hta

                          [Submit][Status][Discuss]

  居然当成162M,结果数组开爆了。。。。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAX=2001;
 4 struct node{
 5     int x,y;
 6 };
 7 node pos[MAX];
 8 struct node1{
 9     int left,right;
10     int cost;
11 };
12 node1 edge[MAX*MAX];
13 int cmp(const node1 &a,const node1 &b){
14     if(a.cost<b.cost) return 1;
15     return 0;
16 }
17 int fa[MAX];
18 int get_fa(int v){
19     if(v!=fa[v]){
20         fa[v]=get_fa(fa[v]);
21     }
22     return fa[v];
23 }
24 int hehe(int m,int n){
25     if(m>n){
26         m=m+n;
27         n=m-n;
28         m=m-n;
29     }
30     int mm=get_fa(m);
31     int nn=get_fa(n);
32     fa[mm]=nn;
33 }
34 int N;
35 int C;
36 int totedge;
37 int sum;
38 int tot;
39 int main(){
40
41     cin>>N>>C;
42     for(int i=1;i<=N;i++){
43         int a,b;
44         cin>>a>>b;
45         pos[i].x=a;
46         pos[i].y=b;
47     }
48
49     for(int i=1;i<=N;i++){
50         for(int j=1;j<=N;j++){
51             edge[++totedge].left=i;
52             edge[totedge].right=j;
53             edge[totedge].cost=(pos[i].x-pos[j].x)*(pos[i].x-pos[j].x)+
54                             (pos[i].y-pos[j].y)*(pos[i].y-pos[j].y);
55         }
56     }
57
58     for(int i=1;i<=N;i++) fa[i]=i;
59     sort(edge+1,edge+totedge+1,cmp);
60     for(int i=1;i<=totedge;i++){
61         if(edge[i].cost>=C){
62             int h=edge[i].left;
63             int g=edge[i].right;
64             if(get_fa(h)!=get_fa(g)){
65                 hehe(h,g);
66                 sum+=edge[i].cost;
67                 tot++;
68                 if(tot==N-1) break;
69             }
70         }
71     }
72
73     if(tot==N-1) cout<<sum;
74     if(tot<N-1) cout<<-1;
75     return 0;
76 } 
时间: 2024-10-01 01:29:11

bzoj 3479: [Usaco2014 Mar]Watering the Fields的相关文章

BZOJ 3479: [Usaco2014 Mar]Watering the Fields( MST )

MST...一开始没注意-1结果就WA了... ---------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<vector> #include<cmath> #include<algorithm> #include<iostream> #define rep

bzoj3479[Usaco2014 Mar]Watering the Fields*

bzoj3479[Usaco2014 Mar]Watering the Fields 题意: 草坪上有N个水龙头,修剪两个水管费用为欧几里得距离的平方. 修水管的人只愿意修费用大于等于c的水管,问将水龙头联通的最小总费用.N≤2000 题解: 最小生成树. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k) for(int i=j;i<=k

BZOJ 3477: [Usaco2014 Mar]Sabotage( 二分答案 )

先二分答案m, 然后对于原序列 A[i] = A[i] - m,  然后O(n)找最大连续子序列和, 那么此时序列由 L + mx + R组成. L + mx + R = sum - n * m, sum为原序列的和. 假如二分的答案m是可行的, 那么 L + R = sum - n * m - mx 应该 <= 0 ------------------------------------------------------------------------------------- #inc

(寒假集训)Watering the Fields (最小生成树)

Watering the Fields 时间限制: 1 Sec  内存限制: 64 MB提交: 26  解决: 10[提交][状态][讨论版] 题目描述 Due to a lack of rain, Farmer John wants to build an irrigation system to send water between his N fields (1 <= N <= 2000). Each field i is described by a distinct point (x

[Usaco2014 Mar]Sabotage

[Usaco2014 Mar]Sabotage 题目 Farmer John"s arch-nemesis, Farmer Paul, has decided to sabotage Farmer John"s milking equipment! The milking equipment consists of a row of N (3 <= N <= 100,000) milking machines, where the ith machine produces

DP经典 BZOJ 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生

BZOJ 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 419  Solved: 278 Description 有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000.现在Farmer John要把这些奶牛分成若干段,定义每段的不河蟹度为:若这段里有k个不同的数,那不河蟹度为k*k.那总的不河蟹度就是所有段的不河蟹度的总和

BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )

一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 shelter 点, 然后对于每个 farm x : S -> cow( x ) = cow( x ) 数量 , shelter( x ) -> T = shelter( x ) 容量 ; 对于每个dist( u , v ) <= m 的 cow( u ) -> shelter( v

[BZOJ] 1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛

1616: [Usaco2008 Mar]Cow Travelling游荡的奶牛 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1312  Solved: 736[Submit][Status][Discuss] Description 奶牛们在被划分成N行M列(2 <= N <= 100; 2 <= M <= 100)的草地上游走,试图找到整块草地中最美味的牧草.Farmer John在某个时刻看见贝茜在位置 (R1, C1),恰好T

[BZOJ] 1639: [Usaco2007 Mar]Monthly Expense 月度开支

1639: [Usaco2007 Mar]Monthly Expense 月度开支 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1077  Solved: 533[Submit][Status][Discuss] Description Farmer John是一个令人惊讶的会计学天才,他已经明白了他可能会花光他的钱,这些钱本来是要维持农场每个月的正常运转的.他已经计算了他以后N(1<=N<=100,000)个工作日中每一天的花费moneyi(1