hdu4126(MST + 树形dp
题意:
这个题目和hdu4756差不多,是给你一个图,然后是q次改变边的权值,权值只增不减,最后问你每次改变之后的最小树的平均值是多少.
思路:(prim+树形dp)
先跑一边最小树(建议用普利姆,别用克鲁斯卡尔,虽然网上有用k过的,但我感觉理论上会超时 n*n*nlog(n)/2),然后树形dp跑出任意两个集合之间的最有替代边.(n^2),然后当每次输入一条要该边的边的时候,先判断先是不是最小树上的边,如果不是那么sum直接加最小树,如果是那么就用sum - dis[u][v] + min(dis ,dp[u][v]);就是用原边和不用原边的最小值,记住此时的原边权值已经改变....
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- #define N (3000 + 100)
- #define inf 9223372036854775807
- using namespace std;
- typedef struct
- {
- int to ,next;
- }STAR;
- STAR E[N*2];
- int list[N] ,tot;
- double map[N][N];
- double dp[N][N];
- 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 minn(double a ,double b)
- {
- return a < b ? a : b;
- }
- double DFS_T_DP(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_T_DP(p ,to ,s);
- now = minn(tmp ,now);
- dp[s][to] = dp[to][s] = minn(dp[s][to] ,tmp);
- }
- if(f != p)
- 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 n ,m ,q ,i ,j ,a ,b;
- double dis;
- while(~scanf("%d %d" ,&n ,&m) && n + m)
- {
- for(i = 0 ;i <= n ;i ++)
- {
- for(j = i + 1 ;j <= n ;j ++)
- P.dis[i][j] = P.dis[j][i] = map[i][j] = map[j][i] = dp[i][j] = dp[j][i] = inf;
- P.dis[i][i] = P.dis[i][i] = map[i][i] = map[i][i] = 0;
- }
- for(i = 1 ;i <= m ;i ++)
- {
- scanf("%d %d %lf" ,&a ,&b ,&dis);
- map[a][b] = map[b][a] = dis;
- P.dis[a][b] = P.dis[b][a] = dis;
- }
- P.n = n;
- memset(list ,0 ,sizeof(list));
- tot = 1;
- P.prim();
- double T_sum = P.ans;
- for(i = 0 ;i < n ;i ++)
- DFS_T_DP(i ,i ,-1);
- double ans_sum = 0;
- scanf("%d" ,&q);
- for(i = 1 ;i <= q ;i ++)
- {
- scanf("%d %d %lf" ,&a ,&b ,&dis);
- double now;
- if(!P.mp[a][b])
- now = T_sum ;
- else
- {
- if(dis > dp[a][b])
- now = T_sum - map[a][b] + dp[a][b] ;
- else
- now = T_sum - map[a][b] + dis ;
- }
- ans_sum += now;
- }
- printf("%.4lf\n" ,ans_sum / q);
- }
- return 0;
- }
hdu4126(MST + 树形dp的更多相关文章
- hdu4756 Install Air Conditioning(MST + 树形DP)
题目请戳这里 题目大意:给n个点,现在要使这n个点连通,并且要求代价最小.现在有2个点之间不能直接连通(除了第一个点),求最小代价. 题目分析:跟这题一样样的,唉,又是原题..先求mst,然后枚举边, ...
- hdu 4756 MST+树形dp ****
题意:给你n(n = 1000)个二维点,第一个点是power plant,还有n - 1个点是dormitories.然后现在知道有一条寝室到寝室的边是不能连的,但是我们不知道是哪条边,问这种情况下 ...
- hdu4126Genghis Khan the ConquerorGenghis Khan the Conqueror(MST+树形DP)
题目请戳这里 题目大意:给n个点,m条边,每条边权值c,现在要使这n个点连通.现在已知某条边要发生突变,再给q个三元组,每个三元组(a,b,c),(a,b)表示图中可能发生突变的边,该边一定是图中的边 ...
- HDU 4126 Genghis Khan the Conqueror MST+树形dp
题意: 给定n个点m条边的无向图. 以下m行给出边和边权 以下Q个询问. Q行每行给出一条边(一定是m条边中的一条) 表示改动边权. (数据保证改动后的边权比原先的边权大) 问:改动后的最小生成树的权 ...
- HDU 4756 Install Air Conditioning (MST+树形DP)
题意:n-1个宿舍,1个供电站,n个位置每两个位置都有边相连,其中有一条边不能连,求n个位置连通的最小花费的最大值. 析:因为要连通,还要权值最小,所以就是MST了,然后就是改变一条边,然后去找出改变 ...
- MST + 树形 dp
Genghis Khan(成吉思汗)(1162-1227), also known by his birth name Temujin(铁木真) and temple name Taizu(元太祖), ...
- HDU-4126 Genghis Khan the Conqueror 树形DP+MST (好题)
题意:给出一个n个点m条边的无向边,q次询问每次询问把一条边权值增大后问新的MST是多少,输出Sum(MST)/q. 解法:一开始想的是破圈法,后来想了想应该不行,破圈法应该只能用于加边的情况而不是修 ...
- 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: ...
- codeforces 709E E. Centroids(树形dp)
题目链接: E. Centroids time limit per test 4 seconds memory limit per test 512 megabytes input standard ...
随机推荐
- macOS下Chrome和Safari导入证实抓包HTTPS
目录 下载证书 mac OS导入证书 Chrome设置代理 Safari设置代理 下面的操作基于Mac OS Catalina(v10.15.3),抓包拦截工具基于Burp Suite v2.1.05 ...
- 分布式文件系统FastDFS简介、搭建、与SpringBoot整合实现图片上传
之前大学时搭建过一个FastDFS的图片服务器,当时只是抱着好奇的态度搭着玩一下,当时搭建采用了一台虚拟机,tracker和storage服务在一台机器上放着,最近翻之前的博客突然想着在两台机器上搭建 ...
- 剑指 Offer 57. 和为s的两个数字 + 二分法 + 双指针
剑指 Offer 57. 和为s的两个数字 Offer_57 题目详情 使用二分法 package com.walegarrett.offer; /** * @Author WaleGarrett * ...
- 有钱人买钻石+dfs中使用贪心
有钱人买钻石 ECNU-3306 题解:这个题目,乍一看以为是dp背包,可是数据量却那么大,只有1,5,10,25四种面额的硬币,每种数量若干,要使得能够刚好兑换成功总金额,在此前提下,还要使得硬币数 ...
- pytorch(08)数据模型的读取(2)
import numpy as np import torch import os import random from PIL import Image from torch.utils.data ...
- 文件查询 select name,age where age>22
# 员工信息表: 完善代码,背下来给代码加注释column_dic = {'id': 0, 'name': 1, 'age': 2, 'phone': 3, 'job': 4} # 将文件每一列的名字 ...
- linux_MYSQL 数据库自动备份并压缩和删除历史备份
1. 创建shell脚本 #! /bin/bash# MySQL用户user="root"# MySQL密码userPWD="123456789"# 需要定时备 ...
- 订单退款&重复支付需求疑问点归纳整理
更新历史记录: 更新内容 更新人 更新时间 新建 Young 2020.12.10 16:45 更新产品疑问解答 Young 2020.12.11 10:14 更新退款权益终止时间 Young 2 ...
- 利用jmeter对WebRTC应用进行压力测试(java)
利用jmeter对WebRTC应用进行压力测试(java) 说明:WebRTC是一款开源的多人即时视频API,与一般的http请求不同,webrtc应用实际压力主要是码流 最近负责了一个WebRTC的 ...
- 深入理解Java并发框架AQS系列(一):线程
深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 一.概述 1.1.前言 重剑无锋,大巧不工 读j.u.c包下的源码,永远无法绕开的经典 ...