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时,每增加一个点都是去掉一条边,不论边两端点是否装有卫星.