1.抓住问题的性质来枚举
2.注意STLbitset用法,bitset bts 可以用来模仿存放两个元素之间关系的二维信息图,也可进行位运算等操作
#include <bits/stdc++.h>
using namespace std;
int n,m=0;
int x[4000],y[4000];
struct ty{
int dis;//dis存x,y两点距离的平方
int x,y;
}a[3000*3000]; //大小大于Cn2 3000*2999/2
bitset<4000> b[4000]; ////bitset bts 用来模仿存放坐标的地图
double dist(int i,int j)
{
return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}
bool cmp(ty a,ty b)
{
return a.dis>b.dis?true:false;
}
int main(void)
{
int m=1;
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&x[i],&y[i]);
for (int i=1;i<=n;i++) //复杂度跟Cn2一样
{
for (int j=i+1;j<=n;j++)
{
++m;
a[m].dis=dist(i,j);
a[m].x=i;
a[m].y=j;
}
}
sort(a+1,a+m+1,cmp);
for (int i=1;i<=m;i++)
{
if( (b[a[i].x] & b[a[i].y]) != 0) //如果枚举到的这条边a[i]的两个顶点a[i].x和a[i].y有公共点,(连向同一个点) ,注意有位运算的判断要加括号!!,不加编译报错
{
printf("%.8f",sqrt(a[i].dis)/2.0);
break;
}
else //否则标记x连上了y,y也连上了x
{
b[a[i].x][a[i].y]=1;
b[a[i].y][a[i].x]=1;
}
}
}