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

思路:
      先跑出一颗最小树,然后枚举树上的每一条边,当这条边被删除的时候,生成树就被分成了两个集合,然后找到一条最小的能让两个集合相通的替代边,最后输出最大的那个(树形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. hdu4126(MST + 树形dp

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

  2. 通俗易懂讲解树形DP

    在做二叉树的题目的时候,如果你觉得和动态规划有点像,那就用动态规划的思想来做,然后树的遍历是后序遍历的,和动态规划由底向上的思想不谋而合 「动态规划」同样可以作用在树形结构上,这样的问题被称为树形 D ...

  3. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  4. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  5. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  6. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  7. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  8. [NC15748]旅游 树形dp基础

    菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...

  9. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

最新文章

  1. cve -2016-6663 mysql 本地提权
  2. 【Android 异步操作】Handler ( 主线程中的 Handler 与 Looper | Handler 原理简介 )
  3. 三条Windows 7小技巧
  4. POJ - 1273 Drainage Ditches(最大流)
  5. mysql事务回滚后,自增ID仍然增加
  6. 2014-10-22 NOIP模拟赛
  7. java switch枚举类,使用枚举类enum代替switch
  8. 怎么用计算机测出来体脂,怎么测体脂比较科学
  9. 【分享】我在名牌大学毕业后的经历
  10. 谷歌、百度你更看好哪一个?
  11. vscode 使用 SDCC 开发 STM8
  12. 关于ancher box 和bounding box的区别
  13. 【单细胞分析】P2.5、聚类,筛选marker基因,可视化
  14. 美国研究生院计算机数据科学排名,美国研究生数据科学专业排名
  15. rtx服务器修改登录端口,rtx服务器地址端口设置
  16. 青龙面板——每日自动拿京豆
  17. 如何建立公司的企业网站
  18. 大数据hadoop和spark怎么选择?
  19. 测试成本--半导体测试最大的障碍
  20. css3-------变换/过渡/动画

热门文章

  1. 打破数据统一的七大原则
  2. 关于Ubuntu运行级别、开机启动脚本的说明
  3. js模版引擎handlebars.js实用教程——为什么选择Handlebars.js
  4. 安装python模块时,遇到error: Unable to find vcvarsall.bat
  5. 理解并演示:思科的netflow功能(200-120新增考点)
  6. 敏捷个人架构图 V1.3
  7. python 中一些常用的内置函数
  8. 关于服务器返回信息的Unicode转码的方法
  9. JS原型继承和类式继承
  10. 不能解决,复选框在request对象获取的信息后显示在用户信息里面为中文的选项名...