博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qin Shi Huang's National Road System HDU - 4081(树形dp+最小生成树)
阅读量:5825 次
发布时间:2019-06-18

本文共 2662 字,大约阅读时间需要 8 分钟。

 

 

感觉这道题和hdu4756很像...

求最小生成树里面删去一边E1 再加一边E2 求该边两顶点权值和除以(最小生成树-E1)的最大值

其中(最小生成树-E1)必须是最小的

先跑一遍prim 跑完之后在最小生成树里面dp

dp[i][j] = i到j的路径中最大的那条边 最小生成树减去dp[i][j]肯定会最小

代码如下

#include 
#include
#include
#include
using namespace std;const double inf = 0x3f3f3f3f3f;const int maxn = 1010;struct Point { double x, y; int n;} point[maxn];struct Edge { int to; int next;} edge[maxn<<1];int n, cnt, head[maxn], pre[maxn];double dis[maxn][maxn], lowc[maxn], sum, dp[maxn][maxn];bool vis[maxn];inline void addedge(int u, int v) { edge[cnt].to = v; edge[cnt].next = head[u]; head[u] = cnt++;}inline double Distance(const Point& lhs, const Point& rhs) { return sqrt((lhs.x - rhs.x) * (lhs.x - rhs.x) + (lhs.y - rhs.y) * (lhs.y - rhs.y));}void prim() { sum = 0.0; memset(vis, 0, sizeof(vis)); memset(pre, 0, sizeof(pre)); for (int i = 1; i < n; i++) lowc[i] = dis[0][i]; vis[0] = true; for (int i = 1; i < n; i++) { double minc = inf; int p = -1; for (int j = 0; j < n; j++) { if (!vis[j] && minc > lowc[j]) { minc = lowc[j]; p = j; } } sum += minc; vis[p] = true; addedge(p, pre[p]); addedge(pre[p], p); for (int j = 0; j < n; j++) { if (!vis[j] && lowc[j] > dis[p][j]) { lowc[j] = dis[p][j]; pre[j] = p; } } }}void dfs(int u, int root) { vis[u] = true; for (int i = head[u]; ~i; i = edge[i].next) { int v = edge[i].to; if (!vis[v]) { dp[root][v] = max(dp[root][u], dis[u][v]); dfs(v, root); } }}int main() { int T; scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%lf%lf%d", &point[i].x, &point[i].y, &point[i].n); } for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { dis[i][j] = dis[j][i] = Distance(point[i], point[j]); } } memset(head, -1, sizeof(head)); cnt = 0; prim(); for (int i = 0; i < n; i++) { memset(vis, 0,sizeof(vis)); dfs(i, i); } double ans = 0; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { double temp = sum - dp[i][j]; temp = (point[i].n + point[j].n) / temp; ans = max(ans, temp); } } printf("%.2f\n", ans); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/Mrzdtz220/p/10514521.html

你可能感兴趣的文章
Bootstrap V4 自学之路 文档目录
查看>>
基于NFS实现lamp的负载均衡之六: 部署discuz论坛
查看>>
6月13日
查看>>
【转】在eclipse上安装 Marketplace Client
查看>>
端口号说明
查看>>
VIM中的多行删除与复制
查看>>
zabbix自定义监控项key值
查看>>
VS2005,VS2008,VS2010快捷键大全
查看>>
xtrabackup备份 搭建M_S
查看>>
手工脱ASPack壳
查看>>
zabbix邮件报警脚本
查看>>
我的友情链接
查看>>
windows的磁盘操作之八——格式化分区的思考
查看>>
python web环境配置 ubuntu web.py apache mod_wsgi
查看>>
Linux基本网络配置
查看>>
等待中
查看>>
java多线程学习-java.util.concurrent详解(二)Semaphore/FutureTask/Exchanger
查看>>
Eclipse里项目导入到Android studio并解决无法编译运行和出现的乱码问题
查看>>
改变magento前台和后台的ico图标
查看>>
Android音频开发(7):使用 OpenSL ES API(下)
查看>>