Arctic Network POJ - 2349

原题链接

考察:最小生成树

错误思路:

       计算每一条边,将最大的s-1条边的距离都变成0,再排序,让生成树选择

这个思路错在最大的边不一定在最小生成树里.我们要让图连通.需要先建一颗最小生成树.再让树的大边变成权值为0的边

谨记:最小生成树不是每条边都选了

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cmath>
 5 #include <vector>
 6 using namespace std;
 7 typedef pair<int,int> pii;
 8 const int N = 510;
 9 pii tower[N];
10 int p[N],s,n;
11 struct Edge{
12     int s,e;
13     double w;
14     bool operator<(const Edge& x)const{
15         return this->w<x.w;
16     }
17 }edge[N*N];
18 int findf(int x)
19 {
20     if(p[x]!=x) p[x] = findf(p[x]);
21     return p[x];
22 }
23 double Getdist(pii s,pii e)
24 {
25     double dist = (s.first-e.first)*(s.first-e.first)+(s.second-e.second)*(s.second-e.second);
26     return sqrt(dist);
27 }
28 int main()
29 {
30 //    freopen("in.txt","r",stdin); 
31     int T;
32     scanf("%d",&T);
33     while(T--)
34     {
35         vector<double> v;
36         int cnt = 0;
37         scanf("%d%d",&s,&n);
38         for(int i=1;i<=n;i++){
39             p[i] = i;
40             scanf("%d%d",&tower[i].first,&tower[i].second);
41         }
42         for(int i=1;i<=n;i++){
43             for(int j=i+1;j<=n;j++){
44                 double w = Getdist(tower[i],tower[j]);
45                 edge[cnt++] = {i,j,w};
46             }
47         }
48         sort(edge,edge+cnt);
49         for(int i=0;i<cnt;i++){
50             int x = edge[i].s,y = edge[i].e;
51             x = findf(x),y = findf(y);
52             if(x!=y){
53                 v.push_back(edge[i].w);
54                 p[x] = y;
55             }
56         }
57         printf("%.2f\n",v[v.size()-s]);
58     }
59     return 0;
60 } 

 

2021.5.4 关于再做一次还是没做出来这件事

想错了,当k>1时,每增加一个点都是去掉一条边,不论边两端点是否装有卫星.

posted @ 2021-01-14 00:49  acmloser  阅读(64)  评论(0编辑  收藏  举报