hdu4756 最小树+树形dp
题意:
给你一个完全图,让你在上面找到一颗最小树,然后问破坏这个最小树的某一条边后用其他边连接(要求最小)成新的树,然后输出破坏每一条边后最小树中最大的那个.
思路:
先跑出一颗最小树,然后枚举树上的每一条边,当这条边被删除的时候,生成树就被分成了两个集合,然后找到一条最小的能让两个集合相通的替代边,最后输出最大的那个(树形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相关推荐
- hdu4126(MST + 树形dp
题意: 这个题目和hdu4756差不多,是给你一个图,然后是q次改变边的权值,权值只增不减,最后问你每次改变之后的最小树的平均值是多少. 思路:(prim+树形dp) 先跑一边 ...
- 通俗易懂讲解树形DP
在做二叉树的题目的时候,如果你觉得和动态规划有点像,那就用动态规划的思想来做,然后树的遍历是后序遍历的,和动态规划由底向上的思想不谋而合 「动态规划」同样可以作用在树形结构上,这样的问题被称为树形 D ...
- BNUOJ 52305 Around the World 树形dp
题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...
- [树形dp] Jzoj P5233 概率博弈
Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...
- fwt优化+树形DP HDU 5909
1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...
- BZOJ 1040 ZJOI2008 骑士 树形DP
题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...
- POJ 3342 树形DP+Hash
这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...
- [NC15748]旅游 树形dp基础
菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...
- 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings
题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...
最新文章
- cve -2016-6663 mysql 本地提权
- 【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )
- 三条Windows 7小技巧
- POJ - 1273 Drainage Ditches(最大流)
- mysql事务回滚后,自增ID仍然增加
- 2014-10-22 NOIP模拟赛
- java switch枚举类,使用枚举类enum代替switch
- 怎么用计算机测出来体脂,怎么测体脂比较科学
- 【分享】我在名牌大学毕业后的经历
- 谷歌、百度你更看好哪一个?
- vscode 使用 SDCC 开发 STM8
- 关于ancher box 和bounding box的区别
- 【单细胞分析】P2.5、聚类,筛选marker基因,可视化
- 美国研究生院计算机数据科学排名,美国研究生数据科学专业排名
- rtx服务器修改登录端口,rtx服务器地址端口设置
- 青龙面板——每日自动拿京豆
- 如何建立公司的企业网站
- 大数据hadoop和spark怎么选择?
- 测试成本--半导体测试最大的障碍
- css3-------变换/过渡/动画
热门文章
- 打破数据统一的七大原则
- 关于Ubuntu运行级别、开机启动脚本的说明
- js模版引擎handlebars.js实用教程——为什么选择Handlebars.js
- 安装python模块时,遇到error: Unable to find vcvarsall.bat
- 理解并演示:思科的netflow功能(200-120新增考点)
- 敏捷个人架构图 V1.3
- python 中一些常用的内置函数
- 关于服务器返回信息的Unicode转码的方法
- JS原型继承和类式继承
- 不能解决,复选框在request对象获取的信息后显示在用户信息里面为中文的选项名...