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

来源:互联网 发布:同步文件软件 编辑:程序博客网 时间:2024/05/18 02:23
#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;}
0 0
原创粉丝点击