[luogu2847]奶牛广播-金
Posted guoyangfan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[luogu2847]奶牛广播-金相关的知识,希望对你有一定的参考价值。
题目描述
FJ的N头牛(1≤N≤1000)为了在他们之间传播信息, 想要组织一个"哞哞广播"系统. 奶牛们决定去用步话机装备自己而不是在很远的距离之外互相哞哞叫, 所以每一头奶牛都必须有一个步话机. 这些步话机都有一个限制传播半径, 但是奶牛们可以间接地通过中间奶牛传播信息, 所以并不是每头牛都必须直接向其他每一头奶牛连边.
奶牛们需要去决定多少钱花在步话机上, 如果他们花了X, 那么他们都将会得到sqrt(x)距离的步话机. 所以, 两头牛之间的欧几里得距离最多是X. 请帮助奶牛们找到最小的X使得图是强连通的.、
输入输出格式
输入格式:
The first line of input contains NN.
The next NN lines each contain the xx and yy coordinates of a single cow. These are both integers in the range 0 ldots 25,0000…25,000.
输出格式:
Write a single line of output containing the integer XX giving the minimum amount the cows must spend on walkie-talkies.
输入输出样例
题目大意:给你N个点,让你求出连接它们的最短路中的最长路。
思路:二分或最小生成树模板。这里放最小生成树的代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 int f[1050],n; 4 struct node{ 5 int u,v; 6 double w; 7 }edge[10500000]; 8 int x[1050],y[1050],tot=0; 9 double ans; 10 inline double dis(int x1,int y1,int x2,int y2) 11 { 12 return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 13 } 14 inline int find(int x) 15 { 16 if(x==f[x])return x; 17 else return f[x]=find(f[x]); 18 } 19 inline bool cmp(node a,node b) 20 { 21 return a.w<b.w; 22 } 23 inline void make() 24 { 25 for(register int i=1;i<=n;++i)f[i]=i; 26 } 27 inline void kruskal() 28 { 29 make(); 30 for(register int i=1;i<=n;++i) 31 for(register int j=1;j<=n;++j) 32 if(i!=j) 33 { 34 edge[++tot].u=i; 35 edge[tot].v=j; 36 edge[tot].w=dis(x[i],y[i],x[j],y[j]); 37 } 38 sort(edge+1,edge+tot+1,cmp); 39 int k=0; 40 for(register int i=1;i<=tot;++i){ 41 int r1=find(edge[i].u),r2=find(edge[i].v); 42 if(r1!=r2){ 43 f[r1]=r2; 44 ++k; 45 ans=edge[i].w; 46 } 47 if(k==n-1)break; 48 } 49 } 50 int main() 51 { 52 //freopen("1.txt","r",stdin); 53 ios::sync_with_stdio(0); 54 cin>>n; 55 for(register int i=1;i<=n;++i) 56 cin>>x[i]>>y[i]; 57 kruskal(); 58 printf("%.0lf",ans*ans); 59 }
以上是关于[luogu2847]奶牛广播-金的主要内容,如果未能解决你的问题,请参考以下文章