标签: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