水个题,明天看链式向前星
P1991 无线通讯网
这个题主要是明白题意就好了
S 个可安装的卫星电话的哨所数,P 个边防哨所的数量,其实也就告诉我们,只需要去找到
P-S个条边就可以了,因为是两种通讯设备,然后就是样例输入可能难理解一点,但是可以自己画个两个图
这个是点的位置的图,也就是点的分布
这个是草稿,两个点之间的边的计算结果,丑了一点,将就这看吧
意思就是,输入的是两个点,连接两个点的边的长度是多少需要我们自己来根据勾股定理来计算,于是这个题就变成了先求边长构造图,然后找表示无线电收发器的最小传输距离就好了
#include<bits/stdc++.h>
using namespace std;
#define maxn 505
int s,p,n;
int arr[maxn];
double ans=0;
struct Arr{
double x,y;
}intput[maxn];
struct brr{
int u,v;
double w;
}e[maxn*maxn],t;
double abc(Arr a,Arr b){//计算边长
double sum= sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
return sum;
}
int cmp(brr x,brr y){
return x.w<y.w;
}
void init(){
for(int i=1;i<=n;i++)
arr[i]=i;
return ;
}
int getf(int v)
{
if(arr[v]==v)
return v;
else
{
arr[v]=getf(arr[v]);
return arr[v];
}
}
int merge(int x,int y)
{
int t1=getf(x);
int t2=getf(y);
if(t1!=t2){
arr[t2]=t1;
return 1;
}
return 0;
}
void find(){
n=p-s;
for(int i=1;n>0;i++){
if(merge(e[i].u,e[i].v)){
ans=max(e[i].w,ans);
n--;
}
}
printf("%.2f",ans);
}
int main(){
cin>>s>>p;
for(int i=1;i<=p;i++){
cin>>intput[i].x>>intput[i].y;
arr[i]=i;
}
int t=1;
for(int i=1;i<=p;i++)
for(int j=i+1;j<=p;j++){
e[t].u=i;
e[t].v=j;
e[t++].w=abc(intput[i],intput[j]);
}
sort(e+1,e+t,cmp);
// for(int i=1;i<=t;i++)
// cout<<e[i].w<<" ";
find();
}
不知道为什么,我用快排去排序一直是错的,就是排了但是没有完全排完,然后我就用sort函数进行排序算了。。。