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;}


原创粉丝点击