10369 - Arctic Network

来源:互联网 发布:iphone桌面软件管理 编辑:程序博客网 时间:2024/06/09 16:31
这题的意思是给出p个点,然后p的点可以由无线电通信或者是卫星通信,然后只有m的点能通过卫星通信,然后用无线电通信的点的距离不能超过D超过D的话惠氏通信的成本增加,问在使通信成本就低的情况下求D

这题还是最小生成树,用prim算法构造MST,在构造的过程将每次算的最小的权值存到数组f里面,然后按照升序排序。因为卫星通信可以无限远,就是说后m的权值可以不用算,所以答案就是f[p-m].

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>using namespace std;const double inf=2500000;double G[555][555]; int x[555],y[555];double low[555]; int vis[555];double f[555];int m,p;double get_dis(int a,int b,int c,int d){    return sqrt(pow(a-c,2.0)+pow(b-d,2.0));}void prim(){    memset(vis,0,sizeof(vis));    int pos=1;    double min;    vis[1]=1;    for(int i=1;i<=p;i++)    low[i]=G[pos][i];    for(int i=1;i<p;i++)    {        min=inf;        for(int j=1;j<=p;j++)        {            if(!vis[j]&&low[j]<min)            {                min=low[j];                pos=j;            }        }        vis[pos]=1;        f[i]=min;        for(int j=1;j<=p;j++)        {            if(!vis[j]&&low[j]>G[pos][j])            low[j]=G[pos][j];        }    }     sort(f+1,f+p);    printf("%0.2lf\n",f[p-m]);}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d %d",&m,&p);        for(int i=1;i<=p;i++)        scanf("%d %d",&x[i],&y[i]);        int k=0;        for(int i=1;i<=p;i++)        {                        for(int j=i+1;j<=p;j++)            G[i][j]=G[j][i]=get_dis(x[i],y[i],x[j],y[j]);        }        prim();    }    return 0;}    

 

0 0