次小生成树。。。
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