注意:
1.判斷少了
2.精度問題(g++編譯器要注意)
求出任意兩線段間距離,再prim
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
const int maxn=1001,INF=1000000000;
struct line{
int x;
int y;
int l;
bool tp;
}l[maxn];
double a[maxn][maxn],d[maxn];
int p[maxn];
double dist(int x1,int y1,int x2,int y2){
return (double)sqrt(double((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));
}
double getdist(int u,int v){
int x1=l[u].x,y1=l[u].y,x2=l[v].x,y2=l[v].y,l1=l[u].l,l2=l[v].l;
if (l[u].tp==l[v].tp){
if(l[u].tp==1){
if (x1+l1>=x2 && x1<=x2 || (x1+l1>=x2+l2 && x2+l2>=x1) ||(x2+l2>=x1 && x2<=x1 )|| (x2+l2>=x1+l1 && x1+l1>=x2))
return abs(y1-y2);
else return fmin(fmin(dist(x1,y1,x2,y2),dist(x1+l1,y1,x2,y2)),fmin(dist(x1,y1,x2+l2,y2),dist(x1+l1,y1,x2+l2,y2)));
}
if(l[u].tp==0){
if (y1+l1>=y2 && y1<=y2 || (y1+l1>=y2+l2 && y2+l2>=y1)||(y2+l2>=y1 && y2<=y1 )|| (y2+l2>=y1+l1 && y1+l1>=y2))
return abs(x1-x2);
else return fmin(fmin(dist(x1,y1,x2,y2),dist(x1,y1+l1,x2,y2)),fmin(dist(x1,y1+l1,x2,y2+l2),dist(x1,y1,x2,y2+l2)));
}
}else{
if (l[u].tp==0){
if (y1<=y2 && y2<=y1+l1 && x1>=x2 && x1<=x2+l2)return 0;
if (y1<=y2 && y2<=y1+l1)
return fmin(abs(x1-x2),abs(x1-(x2+l2)));
if (x1>=x2 && x1<=x2+l2)
return fmin(abs(y1-y2),abs((y1+l1)-y2));
return fmin(fmin(dist(x1,y1,x2,y2),dist(x1,y1+l1,x2,y2)),fmin(dist(x1,y1,x2+l2,y2),dist(x1,y1+l1,x2+l2,y2)));
}else {
if (y2<=y1 && y1<=y2+l2 &&x2>=x1 && x2<=x1+l1 )return 0;
if (y2<=y1 && y1<=y2+l2)
return fmin(abs(x1-x2),abs((x1+l1)-x2));
if (x2>=x1 && x2<=x1+l1)
return fmin(abs(y1-y2),abs(y1-(y2+l2)));
else return fmin(fmin(dist(x1,y1,x2,y2),dist(x1+l1,y1,x2,y2)),fmin(dist(x1+l1,y1,x2,y2+l2),dist(x1,y1,x2,y2+l2)));
}
}
return 0;
}
int main(){
int i,j,k,L,m,n,x,y;
while(scanf("%d",&n) && n){
for (i=1;i<=n;i++){
scanf("%d%d%d",&x,&y,&L);
l[i].x=x;l[i].y=y;l[i].l=abs(L);l[i].tp=(L>=0);
}
for (i=1;i<=n-1;i++)
for (j=i+1;j<=n;j++){
double d1=getdist(i,j);
a[i][j]=d1;a[j][i]=d1;
//printf("%d %d %lf\n",i-1,j-1,d1);
}
for (i=1;i<=n;i++){
d[i]=INF;a[i][i]=0;
p[i]=0;
}
d[1]=0;
double ans=-INF;
for (i=1;i<=n;i++){
double Min=INF;
for (j=1;j<=n;j++)
if (!p[j] && d[j]<Min){
Min=d[j];
k=j;
}
p[k]=1;
ans=fmax(ans,Min);
if (k==2)break;
for (j=1;j<=n;j++)
if (!p[j] && d[j]>a[k][j])d[j]=a[k][j];
}
int t=(int)(ans*1000+5)/10;
printf("%d.%d",t/100,t%100);
if (t%10==0)printf("0");
puts("");
}
return 0;
}