LOJ 新的开始
题目见链接
题解:
最小生成树较好题。。。。
因为 K 台有卫星的村庄可以任意通信,所以可以把这 K 个村庄缩成一个点。
则剩下有 N-K+1 个点要连,则这些点的最小生成树上的最大边即为结果。
代码简单:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=505,K=105; 4 int n,k,x[N],y[N],tot,fa[N]; 5 double ans; 6 struct node{ 7 int x,y; 8 double dis; 9 }e[N*N]; 10 inline double doing(int i,int j) 11 { 12 return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); 13 } 14 inline bool cmp(node a,node b) 15 { 16 return a.dis<b.dis; 17 } 18 inline int getf(int x) 19 { 20 return fa[x]==x?x:fa[x]=getf(fa[x]); 21 } 22 inline void kruskal() 23 { 24 for (int i=1; i<=n; ++i) fa[i]=i; 25 int num=0; 26 for (int i=1; i<=tot; ++i) 27 { 28 int x=getf(e[i].x),y=getf(e[i].y); 29 if (x!=y) 30 { 31 fa[x]=y; 32 num++; 33 if (num==n-k) { ans=e[i].dis; break; } 34 } 35 } 36 } 37 int main() 38 { 39 scanf("%d%d",&n,&k); 40 for (int i=1; i<=n; ++i) 41 { 42 scanf("%d%d",&x[i],&y[i]); 43 } 44 for (int i=1; i<n; ++i) 45 for (int j=i+1; j<=n; ++j) 46 { 47 e[++tot].x=i,e[tot].y=j; 48 e[tot].dis=doing(i,j); 49 } 50 sort(e+1,e+1+tot,cmp); 51 kruskal(); 52 printf("%.2lf ",ans); 53 return 0; 54 }
fighting!