hdu 4081 Qin Shi Huang's National Road System 次小生成树

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;

const int MAXN=1024;
const double INF=1e14;
int n,vis[MAXN],use[MAXN][MAXN],pre[MAXN];
double dist[MAXN],g[MAXN][MAXN],maxcost[MAXN][MAXN];

double prim()
{
    double ret=0.0;
    memset(vis,0,sizeof(vis));
    memset(use,0,sizeof(use));
    memset(maxcost,0,sizeof(maxcost));
    vis[0]=1;
    pre[0]=-1;
    for(int i=0;i<n;i++)
    {
        dist[i]=g[0][i];
        pre[i]=0;
    }
    for(int i=1;i<n;i++)
    {
        double minc=INF;
        int p=-1;
        for(int j=0;j<n;j++)
        {
            if(!vis[j]&&dist[j]<minc)
            {
                minc=dist[j];
                p=j;
            }
        }
        if(p==-1) return -1;
        ret+=dist[p];
        vis[p]=1;
        use[p][pre[p]]=use[pre[p]][p]=1;
        for(int j=0;j<n;j++)
        {
            if(vis[j]&&j!=p)
                maxcost[j][p]=maxcost[p][j]=max(maxcost[j][pre[p]],minc);

            if(!vis[j]&&dist[j]>g[p][j])
            {
                dist[j]=g[p][j];
                pre[j]=p;
            }
        }
    }
    return ret;
}
int x[MAXN],y[MAXN],pe[MAXN];
int main()
{
    int _,i,j;
    scanf("%d",&_);
    while(_--)
    {
        scanf("%d",&n);
        for(i=0;i<n;i++)
            scanf("%d%d%d",&x[i],&y[i],&pe[i]);

        for(i=0;i<n;i++)
        {
            g[i][i]=0;
            for(j=i+1;j<n;j++)
            {
                double t=pow((x[i]-x[j])*1.0,2)+pow((y[i]-y[j])*1.0,2);
                g[j][i]=g[i][j]=sqrt(t);
            }
        }
        double tp,t=prim();
        double ans=-1;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                if(i==j) continue;
                if(use[i][j])
                {
                    tp=(pe[i]+pe[j])*1.0/(t-g[i][j]);
                }
                else
                {
                    tp=(pe[i]+pe[j])*1.0/(t-maxcost[i][j]);
                }
                ans=max(ans,tp);
            }
        }
        printf("%.2lf\n",ans);
    }
    return 0;
}

你可能感兴趣的:(hdu 4081 Qin Shi Huang's National Road System 次小生成树)