题意:

      给你一个完全图,让你在上面找到一颗最小树,然后问破坏这个最小树的某一条边后用其他边连接(要求最小)成新的树,然后输出破坏每一条边后最小树中最大的那个.

思路:

      先跑出一颗最小树,然后枚举树上的每一条边,当这条边被删除的时候,生成树就被分成了两个集合,然后找到一条最小的能让两个集合相通的替代边,最后输出最大的那个(树形dp优化),下面是我的ac记录

想法错了 求的次小树             WA

Kruskal + 并查集优化 暴力枚举   TLE

Kruskal + 树形DP                TLE

Prim    + 树形DP                AC

哎,这个题目时间卡的太紧了, 这个题目非得强调K是解决稀疏图的,P是解决稠密图的...

(下面的Prim之前没用过,之前用的是K,所以直接百度了个模板,然后写成结构体了,所以整个代码有点乱因为要配合百度来的Prim,自己懒啊,不想再看Prim了,只是记下他的模板了,以后遇到卡稠密图的题再粘过来.)


#include<stdio.h>
#include<string.h>
#include<math.h> #define N (1000 + 100) #define inf 100000000

typedef struct
{
int
x ,y;
}
NODE; typedef struct
{
int
a ,b;
double
dis;
}
EDGE; typedef struct
{
int
to ,next;
}
STAR; NODE node[N];
EDGE edge[N*N/2];
STAR E[N*2]; int list[N] ,tot;
double
map[N][N];
double
dp[N][N]; bool camp(EDGE a ,EDGE b)
{
return
a.dis < b.dis;
} void
add(int a, int b)
{

E[++tot].to = b;
E[tot].next = list[a];
list[a] = tot; E[++tot].to = a;
E[tot].next = list[b];
list[b] = tot;
} double
maxx(double a ,double b)
{
return
a > b ? a : b;
} double
minn(double a ,double b)
{
return
a < b ? a : b;
} double
q_dis(double x1 ,double y1 ,double x2 ,double y2)
{
double
x = x1 - x2;
double
y = y1 - y2;
return
sqrt(x * x + y * y);
} double
dfs(int p ,int s ,int f)
{
double
now = inf;
for(int
k = list[s] ;k ;k = E[k].next)
{
int
to = E[k].to;
if(
to == f) continue;
double
tmp = dfs(p ,to ,s);
now = minn(now ,tmp);
dp[s][to] = dp[to][s] = minn(dp[s][to] ,tmp);
}
if(
p != f) now = minn(now ,map[p][s]);
return
now;
} struct
PRIM //从0开始用
{
double
d[N];int vis[N];
bool
mp[N][N]; //标记最小生成树上的边
double ans;//最小树
int n;//点的个数 记得初始化 ***
double dis[N][N]; // 距离 记得初始化 *****
void prim()
{
for(int
i=0;i<n;i++)
{

vis[i]=0;
d[i]=dis[0][i];
}

vis[0]=-1;
ans=0;
memset(mp,0,sizeof(mp));
for(int
i=1;i<n;i++)
{
double
Min= inf;
int
node=-1;
for(int
j=0;j<n;j++)
{
if(
vis[j]!=-1 && d[j]<Min)
{

node=j;
Min=d[j];
}
}
ans+=Min;
mp[vis[node]][node]=mp[node][vis[node]]=1;
add(vis[node],node); // 建树
vis[node]=-1; for(int j=0;j<n;j++)
{
if(
vis[j]!=-1 && d[j]>dis[node][j])
{

vis[j]=node;
d[j]=dis[node][j];
}
}
}
}
}
P; int main ()
{
int
t ,i ,j ,n;
double
pre;
scanf("%d" ,&t);
while(
t --)
{

scanf("%d %lf" ,&n ,&pre);
for(
i = 0 ;i < n ;i ++)
scanf("%d %d" ,&node[i].x ,&node[i].y);
int
tmp = 0;
for(
i = 0 ;i < n ;i ++)
{
for(
j = i ;j < n ;j ++)
{

map[j][i] = map[i][j] = q_dis(node[i].x ,node[i].y ,node[j].x ,node[j].y);
P.dis[i][j] = P.dis[j][i] = map[i][j];
edge[++tmp].a = i;
edge[tmp].b = j;
edge[tmp].dis = map[i][j];
dp[i][j] = dp[j][i] = inf;
}
}
P.n = n;
memset(list ,0 ,sizeof(list));
tot = 1;
P.prim();
for(
i = 1 ;i <= n ;i ++) dfs(i ,i ,-1);
double
T_sum = P.ans;
double
ans = T_sum;
for(
i = 1 ;i < n ;i ++)
for(
j = i + 1 ;j < n ;j ++)
if(
P.mp[i][j])
ans = maxx(ans ,T_sum - map[i][j] + dp[i][j]);
printf("%.2lf\n" ,ans * pre);
}
return
0;
}

hdu4756 最小树+树形dp的更多相关文章

  1. hdu4756 Install Air Conditioning(MST + 树形DP)

    题目请戳这里 题目大意:给n个点,现在要使这n个点连通,并且要求代价最小.现在有2个点之间不能直接连通(除了第一个点),求最小代价. 题目分析:跟这题一样样的,唉,又是原题..先求mst,然后枚举边, ...

  2. hdu4126(MST + 树形dp

    题意:       这个题目和hdu4756差不多,是给你一个图,然后是q次改变边的权值,权值只增不减,最后问你每次改变之后的最小树的平均值是多少. 思路:(prim+树形dp)       先跑一边 ...

  3. 算法进阶面试题05——树形dp解决步骤、返回最大搜索二叉子树的大小、二叉树最远两节点的距离、晚会最大活跃度、手撕缓存结构LRU

    接着第四课的内容,加入部分第五课的内容,主要介绍树形dp和LRU 第一题: 给定一棵二叉树的头节点head,请返回最大搜索二叉子树的大小 二叉树的套路 统一处理逻辑:假设以每个节点为头的这棵树,他的最 ...

  4. BZOJ 4890: [Tjoi2017]城市 树形dp

    标签:树形dp,枚举,树的直径 一上来看到这个题就慌了,只想到了 $O(n^3)$ 的做法. 碰到这种题时要一步一步冷静地去分析,观察数据范围. 首先,$n\leqslant 5000$,所以可以先 ...

  5. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  6. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  7. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  8. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  9. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

随机推荐

  1. cat常用参数

    cat 命令格式 cat [选项] [文件] -A, --show-all:等价于 -vET. -b  --number-nonblank:和 -n 相似,只不过对于空白行不编号. -e:等价于&qu ...

  2. AI在出行场景的应用实践:路线规划、ETA、动态事件挖掘…

    ​前言:又到春招季!作为国民级出行服务平台,高德业务快速发展,大量校招/社招名额开放,欢迎大家投递简历,详情见文末.为帮助大家更了解高德技术,我们策划了#春招专栏#的系列文章,组织各业务团队的高年级同 ...

  3. 面试常备,字符串三剑客 String、StringBuffer、StringBuilder

    尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 「CS-Wiki」Gitee ...

  4. There only 10 people use the same phone as you(i春秋CTF题解)

      (1)访问网址进行CTF测试,仅出现登陆与注册的页面 (2)进行注册尝试登陆并进行burp抓取数据包: (3)注册成功,进行登陆尝试查看信息是否具有提示,在登录的页面只有两个点击页面,一个为:Ch ...

  5. CSV 注入实战

    oxo1 前言 之前看到过 CSV 注入的文章,具体想了解的请搜索学习,这里不多作介绍.今天刚好碰到了导出功能,就随手测试一波,没想到还真的存在 CSV 注入漏洞. oxo2 经过 1.测试漏洞 看到 ...

  6. WPF 应用 - WPF 播放 GIF 的两种方式

    1. 使用 Winform 的 PictureBox 1.1 引用 dll WindowsFormsIntegration.dll System.Windows.Forms.dll System.Dr ...

  7. unittest系列(三)unittest用例如何执行

    在前面的分享中,我们分别讲了unittest的相关流程以及相关断言,那么很多人,都会问了unittest的用例,应该如何执行呢,这次,我们就来看看,unittest用例如何执行.首先,我们可以使用py ...

  8. ajax函数

    使用三个函数是按ajax请求的处理 1.$.ajax() jQuery中实现ajax的核心函数 2.$.post() 使用post方式做ajax请求 3.$.get 使用get方式做ajax请求 $. ...

  9. 前端 | JS Promise:axios 请求结果后面的 .then() 是什么意思?

    Promise 是JS中一种处理异步操作的机制,在现在的前端代码中使用频率很高.Promise 这个词可能有点眼生,但你肯定见过 axios.get(...).then(res => {...} ...

  10. $@ 与 $* 差在哪?-- Shell十三问<第九问>

    $@ 与 $* 差在哪?-- Shell十三问<第九问> 要说 $@ 与 $* 之前,需得先从 shell script 的 positional parameter 谈起.我们都已经知道 ...