题意:

      这个题目和hdu4756差不多,是给你一个图,然后是q次改变边的权值,权值只增不减,最后问你每次改变之后的最小树的平均值是多少.

思路:(prim+树形dp)

      先跑一边最小树(建议用普利姆,别用克鲁斯卡尔,虽然网上有用k过的,但我感觉理论上会超时 n*n*nlog(n)/2),然后树形dp跑出任意两个集合之间的最有替代边.(n^2),然后当每次输入一条要该边的边的时候,先判断先是不是最小树上的边,如果不是那么sum直接加最小树,如果是那么就用sum - dis[u][v] + min(dis ,dp[u][v]);就是用原边和不用原边的最小值,记住此时的原边权值已经改变....


  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4.  
  5. #define N (3000 + 100)
  6. #define inf 9223372036854775807

  7. using namespace std;
  8. typedef struct
  9. {
  10. int to ,next;
  11. }STAR;
  12.  
  13. STAR E[N*2];
  14. int list[N] ,tot;
  15. double map[N][N];
  16. double dp[N][N];
  17. void add(int a ,int b)
  18. {
  19. E[++tot].to = b;
  20. E[tot].next = list[a];
  21. list[a] = tot;
  22. E[++tot].to = a;
  23. E[tot].next = list[b];
  24. list[b] = tot;
  25. }
  26. double minn(double a ,double b)
  27. {
  28. return a < b ? a : b;
  29. }
  30. double DFS_T_DP(int p ,int s ,int f)
  31. {
  32. double now = inf;
  33. for(int k = list[s] ;k ;k = E[k].next)
  34. {
  35. int to = E[k].to;
  36. if(to == f) continue;
  37. double tmp = DFS_T_DP(p ,to ,s);
  38. now = minn(tmp ,now);
  39. dp[s][to] = dp[to][s] = minn(dp[s][to] ,tmp);
  40. }
  41. if(f != p)
  42. now = minn(now ,map[p][s]);
  43. return now;
  44. }
  45. struct PRIM //从0开始用
  46. {
  47. double d[N];int vis[N];
  48. bool mp[N][N]; //标记最小生成树上的边
  49. double ans;//最小树
  50. int n;//点的个数 记得初始化 ***
  51. double dis[N][N]; // 距离 记得初始化 *****
  52. void prim()
  53. {
  54. for(int i=0;i<n;i++)
  55. {
  56. vis[i]=0;
  57. d[i]=dis[0][i];
  58. }
  59. vis[0]=-1;
  60. ans=0;
  61. memset(mp,0,sizeof(mp));
  62. for(int i=1;i<n;i++)
  63. {
  64. double Min= inf;
  65. int node=-1;
  66. for(int j=0;j<n;j++)
  67. {
  68. if(vis[j]!=-1 && d[j]<Min)
  69. {
  70. node=j;
  71. Min=d[j];
  72. }
  73. }
  74.  
  75. ans+=Min;
  76. mp[vis[node]][node]=mp[node][vis[node]]=1;
  77. add(vis[node],node); // 建树
  78. vis[node]=-1;
  79. for(int j=0;j<n;j++)
  80. {
  81. if(vis[j]!=-1 && d[j]>dis[node][j])
  82. {
  83. vis[j]=node;
  84. d[j]=dis[node][j];
  85. }
  86. }
  87. }
  88. }
  89. }P;
  90. int main ()
  91. {
  92. int n ,m ,q ,i ,j ,a ,b;
  93. double dis;
  94. while(~scanf("%d %d" ,&n ,&m) && n + m)
  95. {
  96. for(i = 0 ;i <= n ;i ++)
  97. {
  98. for(j = i + 1 ;j <= n ;j ++)
  99. P.dis[i][j] = P.dis[j][i] = map[i][j] = map[j][i] = dp[i][j] = dp[j][i] = inf;
  100. P.dis[i][i] = P.dis[i][i] = map[i][i] = map[i][i] = 0;
  101. }
  102. for(i = 1 ;i <= m ;i ++)
  103. {
  104. scanf("%d %d %lf" ,&a ,&b ,&dis);
  105. map[a][b] = map[b][a] = dis;
  106. P.dis[a][b] = P.dis[b][a] = dis;
  107. }
  108. P.n = n;
  109. memset(list ,0 ,sizeof(list));
  110. tot = 1;
  111. P.prim();
  112. double T_sum = P.ans;
  113. for(i = 0 ;i < n ;i ++)
  114. DFS_T_DP(i ,i ,-1);
  115. double ans_sum = 0;
  116. scanf("%d" ,&q);
  117. for(i = 1 ;i <= q ;i ++)
  118. {
  119. scanf("%d %d %lf" ,&a ,&b ,&dis);
  120. double now;
  121. if(!P.mp[a][b])
  122. now = T_sum ;
  123. else
  124. {
  125. if(dis > dp[a][b])
  126. now = T_sum - map[a][b] + dp[a][b] ;
  127. else
  128. now = T_sum - map[a][b] + dis ;
  129. }
  130. ans_sum += now;
  131. }
  132. printf("%.4lf\n" ,ans_sum / q);
  133. }
  134. return 0;
  135. }

hdu4126(MST + 树形dp的更多相关文章

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

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

  2. hdu 4756 MST+树形dp ****

    题意:给你n(n = 1000)个二维点,第一个点是power plant,还有n - 1个点是dormitories.然后现在知道有一条寝室到寝室的边是不能连的,但是我们不知道是哪条边,问这种情况下 ...

  3. hdu4126Genghis Khan the ConquerorGenghis Khan the Conqueror(MST+树形DP)

    题目请戳这里 题目大意:给n个点,m条边,每条边权值c,现在要使这n个点连通.现在已知某条边要发生突变,再给q个三元组,每个三元组(a,b,c),(a,b)表示图中可能发生突变的边,该边一定是图中的边 ...

  4. HDU 4126 Genghis Khan the Conqueror MST+树形dp

    题意: 给定n个点m条边的无向图. 以下m行给出边和边权 以下Q个询问. Q行每行给出一条边(一定是m条边中的一条) 表示改动边权. (数据保证改动后的边权比原先的边权大) 问:改动后的最小生成树的权 ...

  5. HDU 4756 Install Air Conditioning (MST+树形DP)

    题意:n-1个宿舍,1个供电站,n个位置每两个位置都有边相连,其中有一条边不能连,求n个位置连通的最小花费的最大值. 析:因为要连通,还要权值最小,所以就是MST了,然后就是改变一条边,然后去找出改变 ...

  6. MST + 树形 dp

    Genghis Khan(成吉思汗)(1162-1227), also known by his birth name Temujin(铁木真) and temple name Taizu(元太祖), ...

  7. HDU-4126 Genghis Khan the Conqueror 树形DP+MST (好题)

    题意:给出一个n个点m条边的无向边,q次询问每次询问把一条边权值增大后问新的MST是多少,输出Sum(MST)/q. 解法:一开始想的是破圈法,后来想了想应该不行,破圈法应该只能用于加边的情况而不是修 ...

  8. hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)

    题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: ...

  9. codeforces 709E E. Centroids(树形dp)

    题目链接: E. Centroids time limit per test 4 seconds memory limit per test 512 megabytes input standard ...

随机推荐

  1. macOS下Chrome和Safari导入证实抓包HTTPS

    目录 下载证书 mac OS导入证书 Chrome设置代理 Safari设置代理 下面的操作基于Mac OS Catalina(v10.15.3),抓包拦截工具基于Burp Suite v2.1.05 ...

  2. 分布式文件系统FastDFS简介、搭建、与SpringBoot整合实现图片上传

    之前大学时搭建过一个FastDFS的图片服务器,当时只是抱着好奇的态度搭着玩一下,当时搭建采用了一台虚拟机,tracker和storage服务在一台机器上放着,最近翻之前的博客突然想着在两台机器上搭建 ...

  3. 剑指 Offer 57. 和为s的两个数字 + 二分法 + 双指针

    剑指 Offer 57. 和为s的两个数字 Offer_57 题目详情 使用二分法 package com.walegarrett.offer; /** * @Author WaleGarrett * ...

  4. 有钱人买钻石+dfs中使用贪心

    有钱人买钻石 ECNU-3306 题解:这个题目,乍一看以为是dp背包,可是数据量却那么大,只有1,5,10,25四种面额的硬币,每种数量若干,要使得能够刚好兑换成功总金额,在此前提下,还要使得硬币数 ...

  5. pytorch(08)数据模型的读取(2)

    import numpy as np import torch import os import random from PIL import Image from torch.utils.data ...

  6. 文件查询 select name,age where age>22

    # 员工信息表: 完善代码,背下来给代码加注释column_dic = {'id': 0, 'name': 1, 'age': 2, 'phone': 3, 'job': 4} # 将文件每一列的名字 ...

  7. linux_MYSQL 数据库自动备份并压缩和删除历史备份

    1. 创建shell脚本 #! /bin/bash# MySQL用户user="root"# MySQL密码userPWD="123456789"# 需要定时备 ...

  8. 订单退款&重复支付需求疑问点归纳整理

    更新历史记录: 更新内容 更新人 更新时间 新建 Young 2020.12.10  16:45 更新产品疑问解答 Young 2020.12.11  10:14 更新退款权益终止时间 Young 2 ...

  9. 利用jmeter对WebRTC应用进行压力测试(java)

    利用jmeter对WebRTC应用进行压力测试(java) 说明:WebRTC是一款开源的多人即时视频API,与一般的http请求不同,webrtc应用实际压力主要是码流 最近负责了一个WebRTC的 ...

  10. 深入理解Java并发框架AQS系列(一):线程

    深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 一.概述 1.1.前言 重剑无锋,大巧不工 读j.u.c包下的源码,永远无法绕开的经典 ...