标签:des blog http os io strong for ar
Description
Input
Output
Sample Input
Sample Output
#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> using namespace std; const int maxn=1105; int n; struct P{ int x,y,p; }v[maxn];//记录城市 double d[maxn][maxn];//城市之间的给定距离 bool vis[maxn];//记录prim中间过程 double maxd[maxn][maxn];//用于记录在树上从i到j需要经过的最大边 typedef pair<int ,int > point;//记录从second到first的一条边 typedef pair<double,point> pr;//first 距离 second 起终点 priority_queue<pr,vector<pr>,greater<pr> >que;//用来prim取最小权值边 double prim(){ memset(vis,0,sizeof(vis)); vis[0]=true;//起点定为0已经在树上了 int num=1;//当前最小生成树中的节点数 while(!que.empty())que.pop();//多组case double ans=0;//记录总边权 for(int i=1;i<n;i++){ que.push(pr(d[0][i],point(i,0)));//把与0相连的加入prim的优先队列 } while(num<n){ double td=que.top().first;//取信息 int t=que.top().second.first; int f=que.top().second.second; que.pop(); if(vis[t])continue;//如果已经加入了那么就不用管了 vis[t]=true;num++;ans+=td;//加点加边 maxd[t][f]=maxd[f][t]=td;//dp求最大边的起点,这两点直接相连 for(int i=0;i<n;i++){ if(!vis[i]){ que.push(pr(d[t][i],point(i,t)));//不在里面的继续更新 } else { if(i!=t){ maxd[t][i]=maxd[i][t]=max(maxd[f][i],td);//在里面的dp求值 } } } } return ans; } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].p); } for(int i=0;i<n;i++){//建图 for(int j=0;j<=i;j++){ d[i][j]=d[j][i]=sqrt((v[i].x-v[j].x)*(v[i].x-v[j].x)+(v[i].y-v[j].y)*(v[i].y-v[j].y)); } } double allt=prim(); double maxrate=-1; for(int i=0;i<n;i++){//取所有可能的城市对 for(int j=0;j<i;j++){ double rate=(v[i].p+v[j].p)/(allt-maxd[i][j]); maxrate=max(maxrate,rate); } } printf("%.2f\n",maxrate); } return 0; }
最小生成树 次小生成树 hdu4081,布布扣,bubuko.com
标签:des blog http os io strong for ar
原文地址:http://www.cnblogs.com/xuesu/p/3910944.html