2349 Arctic Network prim最小生成树 基础

来源:互联网 发布:淘宝无法解绑手机号码 编辑:程序博客网 时间:2024/05/18 01:09
图我们构造完成,调用prim算法,把该算法中每一次贪心得到的最小权边存入一个数组中。算法结束后对那个数组sort递减排序。这样,前边最大的s个用那卫星让他们通信去。然后从第s开始配给他们足够功率的对讲机使。
#include<iostream>using namespace std;#include<algorithm>#include<math.h>#define max 505double map[max][max];double dis[max];int s,p;int ta[max],tb[max];bool vis[max];double sum[max];double ca(int x,int y,int a,int b){ double t=(x-a)*(x-a)+(y-b)*(y-b); return sqrt(t);}bool cmp(double x,double y){ return x>y;}int t=1;void prim(){  for(int i=1;i<=p;i++) {  int temp;  double cf=9999999.0;  for(int j=1;j<=p;j++)  {   if(!vis[j]&&dis[j]<cf)   {    temp=j;    cf=dis[j];   }  }  vis[temp]=true;  if(cf==9999999.0)  cf=0;  sum[t++]=cf;  for(int j=1;j<=p;j++)  {   if(!vis[j]&&dis[j]>map[temp][j])   dis[j]=map[temp][j];  } } return ;}  int main(){ int n;  cin>>n; while(n--) {  t=1;  memset(vis,false,sizeof(vis));  memset(map,9999999.0,sizeof(map));    scanf("%d%d",&s,&p);  for(int i=1;i<=p;i++)  scanf("%d%d",&ta[i],&tb[i]);  for(int i=1;i<=p;i++)  {   for(int j=1;j<=p;j++)   if(j!=i)   map[i][j]=map[j][i]=ca(ta[i],tb[i],ta[j],tb[j]);  }  vis[1]=true;  for(int i=1;i<=p;i++)  dis[i]=map[1][i];  prim();  printf("%.2lf\n",sum[s]); } return 0;}  


 

原创粉丝点击