HDU 4081 Qin Shi Huang's National Road System
最小生成树+枚举+DFS
#include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<algorithm> using namespace std; const double INF=0x7FFFFFFF; const int maxn=1000+10; int T,n,tot; double cost,Max1,Max2,ans; struct Point { double x,y; double val; }p[maxn]; struct Edge { int u,v; double dis; }e[maxn*maxn]; int Father[maxn]; vector<int>Tree[maxn]; int flag[maxn*maxn]; int x[maxn]; bool cmp(const Edge&a,const Edge&b) { return a.dis<b.dis; } void init() { tot=0;cost=0;ans=-INF; memset(flag,0,sizeof flag); for(int i=0;i<=n;i++) Father[i]=i; for(int i=0;i<=n;i++) Tree[i].clear(); } int Find(int x) { if(x!=Father[x]) Father[x]=Find(Father[x]); return Father[x]; } double Dis(int a,int b) { return sqrt((p[a].x-p[b].x)*(p[a].x-p[b].x)+(p[a].y-p[b].y)*(p[a].y-p[b].y)); } void dfs1(int now) { x[now]=1; if(p[now].val>Max1) Max1=p[now].val; for(int i=0;i<Tree[now].size();i++) { int id=Tree[now][i]; if(flag[id]==1) { if(e[id].u==now&&x[e[id].v]==0) dfs1(e[id].v); else if(e[id].v==now&&x[e[id].u]==0) dfs1(e[id].u); } } } void dfs2(int now) { x[now]=1; if(p[now].val>Max2) Max2=p[now].val; for(int i=0;i<Tree[now].size();i++) { int id=Tree[now][i]; if(flag[id]==1) { if(e[id].u==now&&x[e[id].v]==0) dfs2(e[id].v); else if(e[id].v==now&&x[e[id].u]==0) dfs2(e[id].u); } } } int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); init(); for(int i=1;i<=n;i++) scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].val); for(int i=1;i<=n;i++) { for(int j=i+1;j<=n;j++) { e[tot].u=i; e[tot].v=j; e[tot].dis=Dis(i,j); tot++; } } sort(e,e+tot,cmp); for(int i=0;i<tot;i++) { int fx=Find(e[i].u); int fy=Find(e[i].v); if(fx!=fy) { Father[fx]=fy; cost=cost+e[i].dis; Tree[e[i].u].push_back(i); Tree[e[i].v].push_back(i); flag[i]=1; } } for(int i=0;i<tot;i++) { if(flag[i]) { memset(x,0,sizeof x); flag[i]=0; Max1=-INF; Max2=-INF; dfs1(1); for(int i=1;i<=n;i++) if(!x[i]) { dfs2(i); break; } if((1.0*Max1+1.0*Max2)/(cost-e[i].dis)>ans) ans=(1.0*Max1+1.0*Max2)/(cost-e[i].dis); flag[i]=1; } } printf("%.2lf\n",ans); } return 0; }