4081Qin Shi Huang's National Road System
来源:互联网 发布:mac如何安装软件 编辑:程序博客网 时间:2024/05/10 01:02
#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>using namespace std;#define maxn 1100#define maxm 2200#define INF 1100000struct Point{ double x,y,w;}p[maxn];struct Edge{ int s,e; double len;}e[maxn*maxn];int n,m;double tolen;double maxLen[maxn][maxn];int father[maxn];int head[maxn],v[maxm],next[maxm],cnt;double w[maxm];int vis[maxn];void init(){ memset(head,-1,sizeof(head)); memset(father,-1,sizeof(father)); memset(maxLen,0,sizeof(maxLen)); cnt=0;}double Dis(int a,int b){ return sqrt((p[a].x-p[b].x)*(p[a].x-p[b].x) +(p[a].y-p[b].y)*(p[a].y-p[b].y));}void add(int a,int b,double c){ v[cnt]=b; w[cnt]=c; next[cnt]=head[a]; head[a]=cnt++;}bool cmp(Edge a,Edge b){ return a.len<b.len;}int getFather(int i){ if(father[i]==-1) return i; return father[i]=getFather(father[i]);}void kru(){ init(); sort(e+1,e+1+m,cmp); tolen=0.0; int num=0; for(int i=1;i<=m;i++) { int a=getFather(e[i].s); int b=getFather(e[i].e); if(a!=b) { num++; father[a]=b; tolen+=e[i].len; add(e[i].s,e[i].e,e[i].len); add(e[i].e,e[i].s,e[i].len); } if(num==n-1) break; }}void dfs(int u,int x){ for(int i=head[x];~i;i=next[i]) if(!vis[v[i]]) { vis[v[i]]=1; maxLen[u][v[i]]=max(maxLen[u][x],Dis(x,v[i])); dfs(u,v[i]); }}void solve(int u){ memset(vis,0,sizeof(vis)); vis[u]=1; dfs(u,u);}int main(){ int t; cin>>t; while(t--) { cin>>n; for(int i=1; i<=n; i++) scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].w); m=0; for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { m++; e[m].s=i; e[m].e=j; e[m].len=Dis(i,j); } } kru(); for(int i=1; i<=n; i++) solve(i); double pi=0.0; for(int i=1; i<=n; i++) { double tmp; for(int j=i+1; j<=n; j++) { tmp=p[i].w+p[j].w; pi=max(pi,tmp/(tolen-maxLen[i][j])); } } printf("%.2lf\n",pi); } return 0;}