题意:

      这个题目和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的更多相关文章

  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. IDEA SVN 使用

    转: IDEA SVN 使用 一.上传项目到 SVN VCS -> Import into Version Control -> Share Project(Subversion) 点击 ...

  2. 基于Hi3559AV100 RFCN实现细节解析-(2)RFCN数据流分析

    下面随笔系列将对Hi3559AV100 RFCN实现细节进行解析,整个过程涉及到VI.VDEC.VPSS.VGS.VO.NNIE,其中涉及的内容,大家可以参考之前我写的博客: Hi3559AV100的 ...

  3. 关于PHP的表单数组提交显示

    1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title></title> 5 <meta chars ...

  4. kali msf6 更新及bug处理

    问题描述 Metasploit 漏洞库更新,利用msfupdate命令更新,出现已停止该命令更新,出现如下提示: 利用一句话安装更新,命令如下,安装过程中有部分警告出现 curl https://ra ...

  5. 使用自定义注解和切面AOP实现Java程序增强

    1.注解介绍 1.1注解的本质 Oracle官方对注解的定义为: Annotations, a form of metadata, provide data about a program that ...

  6. CSS网页的布局

    1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...

  7. .NetCore 导出Execl

    /* Nuget  - NPOI.2.5.1 */ using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using NPOI.XSSF.UserMode ...

  8. error: failed to push some refs to 'XXX'

    遇到上述无法提交的问题:都是这种命令git push -u origin master造成的 查看github上的提示: 解决:把之前的命令中的master修改成main就好了

  9. 图解 | 原来这就是 class

    我是一个 .java 文件,名叫 FlashObject.java,叫我小渣就行. public class FlashObject {    private String name;    priv ...

  10. 从源码剖析Go语言基于信号抢占式调度

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/485 本文使用的go的源码15.7 这一次来讲讲基于信号式抢占式调度 ...