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<stack> #include<queue> #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #pragma commment(linker,"/STACK: 102400000 102400000") using namespace std; const double eps=1e-6; const int INF=0x3f3f3f3f; const int MAXN=1e3+20; struct city { int x,y,p; }; city c[MAXN]; int V,par[MAXN];//par数组记录生成树上i的上一个点 bool used[MAXN][MAXN],visit[MAXN]; double mincost[MAXN],cost[MAXN][MAXN],dp[MAXN][MAXN]; double prim() { memset(visit,false,sizeof(visit)); memset(dp,0,sizeof(dp)); memset(used,false,sizeof(used)); for(int i=1; i<=V; i++) { mincost[i]=cost[1][i]; par[i]=1; } visit[1]=true; double res=0; for(int i=1; i<V; i++) { int v=-1; for(int j=1; j<=V; j++) if(!visit[j]&&(v==-1||mincost[j]<mincost[v])) v=j; if(v==-1) break; visit[v]=true; used[v][par[v]]=used[par[v]][v]=true; res+=mincost[v]; for(int j=1; j<=V; j++) { if(!visit[j]&&cost[v][j]<mincost[j]) { mincost[j]=cost[v][j]; par[j]=v; } if(visit[j]&&j!=v) { dp[v][j]=dp[j][v]=max(dp[j][par[v]],mincost[v]); } } } return res; } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE int tcase; scanf("%d",&tcase); while(tcase--) { scanf("%d",&V); for(int i=1; i<=V; i++) scanf("%d%d%d",&c[i].x,&c[i].y,&c[i].p); for(int i=1; i<=V; i++) for(int j=1; j<=V; j++) cost[i][j]=cost[j][i]=sqrt((c[i].x-c[j].x)*(c[i].x-c[j].x)+(c[i].y-c[j].y)*(c[i].y-c[j].y)); double mst=prim(); double ans=-1; for(int i=1; i<=V; i++) { for(int j=1; j<=V; j++) { if(i==j) continue; if(used[i][j])//i和j之间的边是否在最小生成树上 ans=max(ans,(c[i].p+c[j].p+0.0)/(mst-cost[i][j])); else ans=max(ans,(c[i].p+c[j].p+0.0)/(mst-dp[i][j])); } } printf("%.2lf\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 4081 Qin Shi Huang's National Road System(prim)
原文地址:http://blog.csdn.net/noooooorth/article/details/47319283