首页 > 代码库 > NOIP模拟赛 无线通讯网

NOIP模拟赛 无线通讯网

【题目描述】

     国防部计划用无线网络连接若干个边防哨所。2种不同的通讯技术用来搭建无线网络;每个边防哨所都要配备无线电收发器;有一些哨所还可以增配卫星电话。

任意两个配备了一条卫星电话线路的哨所(两边都拥有卫星电话)均可以通话,无论他们相距多远。而只通过无线电收发器通话的哨所之间的距离不能超过D,这是受收发器的功率限制。收发器的功率越高,通话距离D会更远,但同时价格也会更贵。

收发器需要统一购买和安装,所以全部哨所只能选择安装一种型号的收发器。换句话说,每一对哨所之间的通话距离都是同一个D。

你的任务是确定收发器必须的最小通话距离D,使得每一对哨所之间至少有一条通话路径(直接的或者间接的)。

【输入格式】 wireless.in

第1行:2个整数S(1<=S<=100)和P(S<P<=500),S表示可安装的卫星电话的哨所数,P表示边防哨所的数量。

     接下里P行,每行描述一个哨所的平面坐标(x,y),以km为单位,整数,0<=x,y<=10000。

【输出格式】 wireless.out

第1行:1个实数D,表示无线电收发器的最小传输距离。精确到小数点后两位。

【样例输入】

 2 4

 0 100

 0 300

 0 600

 150 750

【样例输出】

212.13

 

数据范围

对于20%的数据  P=2,S=1

对于另外20%的数据  P=4,S=2

对于100%的数据  1<=S<=100,S<P<=500 

 

kruskal最小生成树

题解:

用vector容器储存最大值

有几个卫星电话,就取倒数第几个最大值

 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7  8 struct Edge 9 {10     int u,v;11     double w;12 }E[300000];13 int F[501];14 15 vector<double> ans;16 17 int s,p,node=0,x[501],y[501];18 19 int read()20 {21     int x=0,f=1;char ch=getchar();22     while(ch<0||ch>9){if(ch==-)f=-f;ch=getchar();}23     while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}24     return x*f;25 }26 27 bool cmp(Edge A,Edge B)28 {29     return A.w<B.w;30 }31 32 int find(int a)33 {34     while(F[a]!=0) a=F[a];35     return a;36 }37 38 int main()39 {40     s=read();p=read();41     for(int i=1;i<=p;i++)42     {43         x[i]=read();y[i]=read();44     }45     for(int i=1;i<=p;i++)46         for(int j=i+1;j<=p;j++)47         {48             E[node++]=(Edge){i,j,sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]))};49         }50     sort(E,E+node,cmp);51     int num=p;52     for(int i=0;i<node&&num>0;i++)53     {54         int u=find(E[i].u);55         int v=find(E[i].v);56         if(u!=v)57         {58             F[u]=v;59             num--;60             ans.push_back(E[i].w);61         }62     }63     sort(ans.begin(),ans.end());64     printf("%.2lf",ans[p-s-1]);65     return 0;66 }

 

NOIP模拟赛 无线通讯网