您的位置:首页 > 其它

4081 Qin Shi Huang's National Road System

2013-10-24 22:30 363 查看
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
#define maxn 1100
#define maxm 2200
#define INF 1100000
struct 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: