
2 4 1 1 20 1 2 30 200 2 80 200 1 100 3 1 1 20 1 2 30 2 2 40
65.00 70.00
#include<stdio.h>
#include<math.h>
#include<vector>
#include<string.h>
using namespace std;
const double inf=99999999;
const int N = 1005;
struct EDG
{
    int u,v;
};
int n,vist[N],P[N];
double node[N],map[N][N],sum,R;
vector<int>tmap[N];
EDG edg[N];
void prim(int s)
{
    int ts,k=0,f[N];
    double mint;
    for(int i=1;i<=n;i++)
        node[i]=inf,vist[i]=0;
    sum=0;
    vist[s]=1; node[s]=0; k++;
    while(k<n)
    {
        mint=inf;
        for(int i=1;i<=n;i++)
        if(vist[i]==0)
        {
            if(node[i]>map[s][i])
                node[i]=map[s][i],f[i]=s;
            if(mint>node[i])
                mint=node[i],ts=i;
        }
        sum+=mint;
        edg[k].u=f[ts]; edg[k].v=ts;
        tmap[f[ts]].push_back(ts);
        tmap[ts].push_back(f[ts]);
        s=ts; vist[s]=1; k++;
    }
}
int DFS(int s,int maxp)
{
    vist[s]=1;
    if(maxp<P[s])
        maxp=P[s];
    for(int i=0; i<tmap[s].size(); i++)
    {
        if(vist[tmap[s][i]])
            continue;
        maxp=DFS(tmap[s][i],maxp);
    }
    vist[s]=0;
    return maxp;
}
int main()
{
    int t;
    double x[N],y[N];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%lf%lf%d",&x[i],&y[i],&P[i]);
        for(int i=1;i<=n;i++)
        {
            tmap[i].clear();
            for(int j=1;j<=n;j++)
            map[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
        }
        prim(1);
        R=-1;
        memset(vist,0,sizeof(vist));
        for(int i=1;i<n; i++)//从最小生成树中去掉一个边,变成两个连通子图,再加入一个边使之连通,加入的长度一定大于等于去掉的边,所以加入的边徐福修。
        {
            vist[edg[i].v]=1;
            int t1=DFS(edg[i].u,0);
            vist[edg[i].u]=1;
            int t2=DFS(edg[i].v,0);
            vist[edg[i].u]=0;
            if((t1+t2)/(sum-map[edg[i].u][edg[i].v])>R)
                R=(t1+t2)/(sum-map[edg[i].u][edg[i].v]);
        }
        printf("%.2lf\n",R);
    }
}
HDU4081Qin Shi Huang's National Road System(最小生成树+DFS)
原文:http://blog.csdn.net/u010372095/article/details/44202997