当前位置: 代码迷 >> 综合 >> POJ - 2349 Arctic Network (最小生成树,剩S个连通分量)
  详细解决方案

POJ - 2349 Arctic Network (最小生成树,剩S个连通分量)

热度:32   发布时间:2024-01-22 01:58:02.0

题意:

    有P个站点需要远程通信,他们能通过无线电或者卫星来通信。如果两个站点通过卫星来通信的话,无论多远,都行并不花钱。如果通过无线电通信的话,需要花钱且距离越长花费越大。现有S个卫星接收器,求无线电通信站点间的所有距离中的最大值D尽量小。求这个D。

 

题解:

     最小生成树变形:

一般的最小生成树,kk算法中是使得最后剩一个联通分量,现在有S个卫星接收器,可以连接S个联通分量,所以只需将kk算法改一下就行判定条件就行了。剩S个连通分量的时候就停下来。

 

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<vector>
#include<functional>
#include<utility>
#include<set>
#include<map>
#include<cmath>
#include<cctype>using namespace std;
const int maxn=505;struct point{double x,y;}a[maxn];
struct edge
{int u,v;double cost;edge(int u,int v,double d):u(u),v(v),cost(d){}bool operator<(const edge& a)const{return cost<a.cost;}
};vector<edge>es;
int pa[maxn];
int n,s;
int findset(int x){return pa[x]<0?x:pa[x]=findset(pa[x]);}double kk()
{int cnt=0;double ans=0;memset(pa,-1,sizeof(pa));sort(es.begin(),es.end());for(int i=0;i<es.size();i++){int u=es[i].u,v=es[i].v;if(findset(u)!=findset(v)){//ans+=es[i].cost;pa[findset(u)]=findset(v);if(++cnt>=n-s){ans=es[i].cost;break;}//这儿!!!}}return ans;
}double dist(int i,int j)
{return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y))    ;
}int main()
{int t;cin>>t;while(t--){es.clear();cin>>s>>n;for(int i=0;i<n;i++)cin>>a[i].x>>a[i].y;for(int i=0;i<n;i++)for(int j=i;j<n;j++)es.push_back(edge(i,j,dist(i,j)));printf("%.2lf\n",kk());}
}

  相关解决方案