把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

题解:无线通讯网

qwq

跑最小生成树

一共n个电话,所以相当于最小生成树里删去最大的n-1的边

所以答案即为最小生成树的第n大边

prim或者kruskal都行

这是prim

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 using namespace std;
 6 int x[505], y[505];
 7 int p, n, now, cnt;
 8 double ans[505], dis[505][505], d[505];
 9 bool used[505];
10 bool cmp(double a,double b){
11      return a>b;
12 }
13 int main(){
14     scanf("%d%d",&p,&n);
15     for(int i=1; i<=n; i++){
16         scanf("%d%d",&x[i],&y[i]);
17         d[i]=0x3f3f3f3f;
18     }
19     for(int i=1; i<=n; i++){
20         for(int j=1; j<i; j++){
21             double a=x[i]-x[j];
22             double b=y[i]-y[j];
23             a*=a;
24             b*=b;
25             dis[i][j]=sqrt(a+b);
26             dis[j][i]=dis[i][j];
27         }
28     }
29     d[1]=0;
30     for(int i=1; i<=n; i++){
31         double minn=0x3f3f3f3f3f;
32         for(int j=1; j<=n; j++){
33             if(minn>d[j] && !used[j]){
34                 minn=d[j];
35                 now=j;
36             }
37         }
38         used[now]=true;
39         ans[++cnt]=minn;
40         for(int j=1; j<=n; j++){
41             if(!used[j]){
42                 d[j]=min(d[j], dis[now][j]);
43             }
44         }
45     }
46     sort(ans+1, ans+n+1, cmp);//按照从大到小排序
47     printf("%.2lf", ans[p]);
48     return 0;
49 }

这是kruskal,来自于pushinl

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstring>
 6 #define N 501
 7 using namespace std;
 8 int f[N], px[N], py[N];
 9 double ans[N];
10 int n, k, num, cnt;
11 struct data{
12     int x, y;
13     double d;
14 }b[N*N];
15 double dis(int ax, int ay, int bx, int by){
16     return sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by));
17 }
18 int find(int x){
19     if(f[x]!=x)f[x]=find(f[x]);
20     return f[x];
21 }
22 inline bool cmp(const data&a, const data&b){
23     return a.d<b.d;
24 }
25 int main(){
26     scanf("%d%d", &k, &n);
27     for(int i=1; i<=n; i++)
28         scanf("%d%d", &px[i], &py[i]);
29     for(int i=1; i<=n; i++)
30         for(int j=i+1; j<=n; j++)
31             b[++num]=(data){i, j, dis(px[i], py[i], px[j], py[j])};
32     sort(b+1, b+num+1, cmp);
33     for(int i=1; i<=n; i++)
34         f[i]=i;
35     for(int i=1; i<=num; i++){
36         int x=find(b[i].x);
37         int y=find(b[i].y);
38         if(x!=y){
39             f[y]=x;
40             ans[++cnt]=b[i].d;
41         }
42         if(cnt==n-1)break;//枚举到n-1或者n-k也行
43     }
44     printf("%.2f", ans[n-k]);注意是n-k,因为这里并没有重新排序,
45     return 0;
46 }

话说luogu数据真的是十分水了orzzz

 

posted @ 2018-10-31 21:29  AZe-qwq  阅读(198)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end