
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