思路:直接先求一下最小生成树,然后用树形dp来求最优值。也就是两遍dfs。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define Maxn 2010
using namespace std;
struct Edge{
int u,v;
double c;
int operator <(const Edge &temp) const
{
return c<temp.c;
}
}p[];
struct PP{
int u,v,next;
double val;
}edge[Maxn*];
struct Point{
double x,y;
}city[Maxn];
int set[Maxn],e,vi[],num[Maxn],head[Maxn],road[Maxn],Max[Maxn],lMax[Maxn];
double ans,S;
int find(int x)
{
if(x!=set[x])
set[x]=find(set[x]);
return set[x];
}
int merg(int a,int b)
{
int x,y;
x=find(a);
y=find(b);
if(x==y)
return ;
set[x]=y;
return ;
}
void add(int u,int v,double val)
{
edge[e].u=u,edge[e].v=v,edge[e].val=val,edge[e].next=head[u],head[u]=e++;
edge[e].u=v,edge[e].v=u,edge[e].val=val,edge[e].next=head[v],head[v]=e++;
memset(Max,,sizeof(Max));
}
double DIS(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void init()
{
for(int i=;i<Maxn;i++)
set[i]=i,num[i]=;
memset(head,-,sizeof(head));
memset(vi,,sizeof(vi));
memset(road,,sizeof(road));
e=;
}
void dfs(int u)
{
int i,v;
vi[u]=;
Max[u]=lMax[u]=num[u];
for(i=head[u];i!=-;i=edge[i].next){
v=edge[i].v;
if(vi[v]) continue;
dfs(v);
if(Max[v]>Max[u]){
lMax[u]=Max[u];
Max[u]=Max[v];
road[u]=v;
}
else if(Max[v]>lMax[u]){
lMax[u]=Max[v];
}
}
}
void predfs(int u,int sum)
{
int i,v;
vi[u]=;
double a,b;
for(i=head[u];i!=-;i=edge[i].next){
v=edge[i].v;
if(vi[v]) continue;
if(road[u]==v) a=max(lMax[u],sum);
else a=max(sum,Max[u]);
a+=Max[v];
b=S-edge[i].val;
if(a/b>ans){
ans=a/b;
}
if(road[u]==v) predfs(v,max(lMax[u],sum));
else predfs(v,max(Max[u],sum));
}
}
int main()
{
int t,n,m,i,j,x,y,c;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%lf%lf%d",&city[i].x,&city[i].y,&num[i]);
int cnt=;
for(i=;i<=n;i++){
for(j=i+;j<=n;j++){
p[++cnt].u=i,p[cnt].v=j,p[cnt].c=DIS(city[i],city[j]);
}
}
sort(p+,p++cnt);
int cc=;
double temp=;
int lis[Maxn];
for(i=;i<=cnt;i++){
if(merg(p[i].u,p[i].v)){
temp+=p[i].c;
lis[++cc]=i;
}
if(cc==n-)
break;
}
for(i=;i<=cc;i++){
add(p[lis[i]].u,p[lis[i]].v,p[lis[i]].c);
}
S=temp;
ans=;
dfs();
memset(vi,,sizeof(vi));
predfs(,);
printf("%.2lf\n",ans);
}
return ;
}

hdu 4081 最小生成树+树形dp的更多相关文章

  1. Qin Shi Huang's National Road System HDU - 4081(树形dp+最小生成树)

    Qin Shi Huang's National Road System HDU - 4081 感觉这道题和hdu4756很像... 求最小生成树里面删去一边E1 再加一边E2 求该边两顶点权值和除以 ...

  2. Install Air Conditioning HDU - 4756(最小生成树+树形dp)

    Install Air Conditioning HDU - 4756 题意是要让n-1间宿舍和发电站相连 也就是连通嘛 最小生成树板子一套 但是还有个限制条件 就是其中有两个宿舍是不能连着的 要求所 ...

  3. HDU 4126 Genghis Khan the Conqueror 最小生成树+树形dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4126 Genghis Khan the Conqueror Time Limit: 10000/50 ...

  4. HDU 2196.Computer 树形dp 树的直径

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  5. HDU 2196 Computer 树形DP经典题

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2196 题意:每一个电脑都用线连接到了还有一台电脑,连接用的线有一定的长度,最后把全部电脑连成了一棵树,问 ...

  6. hdu 6201 【树形dp||SPFA最长路】

    http://acm.hdu.edu.cn/showproblem.php?pid=6201 n个城市都在卖一种书,该书的价格在i城市为cost[i],商人打算从某个城市出发到另一个城市结束,途中可以 ...

  7. HDU 2196 Computer 树形DP 经典题

    给出一棵树,边有权值,求出离每一个节点最远的点的距离 树形DP,经典题 本来这道题是无根树,可以随意选择root, 但是根据输入数据的方式,选择root=1明显可以方便很多. 我们先把边权转化为点权, ...

  8. HDU 3899 简单树形DP

    题意:一棵树,给出每个点的权值和每条边的长度, 点j到点i的代价为点j的权值乘以连接i和j的边的长度.求点x使得所有点到点x的代价最小,输出 虽然还是不太懂树形DP是什么意思,先把代码贴出来把. 这道 ...

  9. HDU 4714 Tree2cycle (树形DP)

    题意:给定一棵树,断开一条边或者接上一条边都要花费 1,问你花费最少把这棵树就成一个环. 析:树形DP,想一想,要想把一棵树变成一个环,那么就要把一些枝枝叶叶都换掉,对于一个分叉是大于等于2的我们一定 ...

随机推荐

  1. 12.组合(Composition)

    组合也是关联关系的一种特例,它体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合:它同样体现整体与部分间的关系,但此时整体与部分是不可分的,它们具有统一的生存期,整体的生命周期结 ...

  2. js 函数的传值问题

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. 编写 Window 服务程序

    编写 Window 服务程序     一.直观认识Windows服务.        打开Windows“控制面板/管理工具/服务”,系统显示Windows服务列表.                  ...

  4. Uva 10167 - Birthday Cake 暴力枚举 随机

      Problem G. Birthday Cake Background Lucy and Lily are twins. Today is their birthday. Mother buys ...

  5. Netsh配置端口

    开启防火墙端口 netsh firewall set portopening all 3389 RDP_Rule enable (TCP/UDP) #配置RPC高位端口段Netsh int ipv4 ...

  6. ghostDoct 使用 (转 http://www.cnblogs.com/RockyMyx/archive/2010/04/20/Project-Route-Using-GhostDoc.html)

    一.简介 GhostDoc是Visual Studio的一个免费插件,可以为开发人员自动生成XML格式的注释文档. 二.下载 需要的朋友可以去这里下载,填个Email地址就可以下了:GhostDoc下 ...

  7. 【M33】将非尾端类设计为抽象类

    1.考虑下面的需求,软件处理动物,Cat与Dog需要特殊处理,因此,设计Cat和Dog继承Animal.Animal有copy赋值(不是虚方法),Cat和Dog也有copy赋值.考虑下面的情况: Ca ...

  8. pjsip视频通信开发(上层应用)之EditText重写

    我们经常使用手机的打电话功能,当我们按键盘的时候,有一个地方显示我们按键的内容,当我们的手点击那个地方的时候,并没有弹出软件盘,所以我们再有数字键盘的时候,要屏蔽系统的软件盘. 我们分析一下,软件盘弹 ...

  9. 分享 Java微信开发SDK

    分享 Java微信开发SDK •发布于 4周前  •作者 朋也  •432 次浏览  •最后一次编辑是 2周前  •来自 分享 给大家分享两个java开发微信公众号的sdk jfinal-weixin ...

  10. 【JavsScript】XMLHttpRequest Level 2 使用指南

    XMLHttpRequest是一个浏览器接口,使得Javascript可以进行HTTP(S)通信. 最早,微软在IE 5引进了这个接口.因为它太有用,其他浏览器也模仿部署了,ajax操作因此得以诞生. ...