次小生成树。。。

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 <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn=1100,INF=0x3f3f3f3f;
const double eps=1e-8;
int N;
double G[maxn][maxn];
struct CITY
{
int x,y,p;
}city[maxn];
double getdist(CITY a,CITY b)
{
double dx=(double)((a.x-b.x)*(a.x-b.x));
double dy=(double)((a.y-b.y)*(a.y-b.y));
return sqrt(dx+dy);
}
int vis[maxn],fa[maxn];
double dist[maxn],mind[maxn][maxn];
double prim()
{
double mst=0.;
for(int i=0;i<=N;i++) fa[i]=i,dist[i]=99999,vis[i]=0;
memset(mind,0,sizeof(mind));
dist[1]=0;
int mark;double dd;
for(int k=0;k<N;k++)
{
mark=-1;dd=99999;
for(int i=1;i<=N;i++)
{
if(!vis[i]&&dd+eps>dist[i])
{
mark=i; dd=dist[i];
}
}
vis[mark]=true;mst+=dd;
for(int i=1;i<=N;i++)
{
if(i==mark) continue;
if(vis[i])
{
mind[i][mark]=mind[mark][i]=max(dd,mind[fa[mark]][i]);
}
}
for(int i=1;i<=N;i++)
{
if(vis[i]==0&&dist[i]+eps>G[mark][i])
{
dist[i]=G[mark][i];
fa[i]=mark;
}
}
}
return mst;
}
int main()
{
int tr;
scanf("%d",&tr);
while(tr--)
{
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
city[i]=(CITY){a,b,c};
}
memset(G,0,sizeof(G));
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
if(i==j) G[i][j]=0;
else
{
G[i][j]=G[j][i]=getdist(city[i],city[j]);
}
}
}
double mst=prim();
double ans=0;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
if(i==j) continue;
if(i!=fa[j]&&j!=fa[i])
{
ans=max(ans,(city[i].p+city[j].p)/(mst-mind[i][j]));
}
else
{
ans=max(ans,(city[i].p+city[j].p)/(mst-G[i][j]));
}
}
}
printf("%.2lf\n",ans);
}
return 0;
}
HDOJ 4081 Qin Shi Huang's National Road System
原文:http://blog.csdn.net/u012797220/article/details/19630335