「日常训练」 Genghis Khan the Conqueror(HDU-4126)

题意

给定\(n\)个点和\(m\)条无向边(\(n\le 3000\)),需要将这\(n\)个点连通。但是有\(Q\)次(\(Q\le 10^4\))等概率的破坏,每次破坏会把\(m\)条边中的某条边的权值增大某个值,求\(Q\)次破坏每次将\(n\)个点连通的代价的期望?(全题的数据范围在int内可以过)

分析

这题是真的牛逼,我看了七八个博客都没看太明白,大多数人都没讲在点子上,但是还是有几篇博客不错的,参考如下:
参考A:https://blog.csdn.net/u014664226/article/details/49333081
参考B:https://blog.csdn.net/Anxdada/article/details/81086041
参考C:https://blog.csdn.net/ramay7/article/details/52236040 (这个是最好的,强烈推荐)
参考D:https://blog.csdn.net/gatevin/article/details/47042021 (有一些“实质上”的东西)

接下来说说我综合这些参考后自己对这题的理解与做法。

求期望的意思是,将每次破坏后的最小生成树的代价累加除以\(Q\)。然后我们仔细思考一下这个破坏。首先,如果更改发生在不是最小生成树上的边上,那么答案是不需要改变的。重点是改变发生在这棵生成树上的边中的情况下。此时这棵最小生成树会分成两棵树。显然地,新图的最小生成树一定包含这两棵树上的所有边。问题于是转化为原来的最小生成树被切成两棵树之后,如何选择权值最小的一条边将两棵树连通。
这里因此运用了树形dp。这里比较精彩:
我们记\(dp[i][j]\)是切断\((i,j)\)边后,i与j两个所在点的集合间的最短距离。但是我们不去直接这么搜索,而是去搜索i所在树的树根与j所在子树的每一个点的最短距离。于是我们将每个点当作树根进行DFS,在更新(搜索)时,我们用j所在子树所有点同root的直接距离更新掉dp数组,并有意归避掉\((i,j)\)边。可以想见,当第\(i\)轮更新完成,dp中一定保存了第1个到第\(i\)个root到他们相关点的最短距离。那么对每个点都dp过后,最后dp数组里面一定保存的就是我们要的东西了。

最后对每个查询做修正就可以了,具体见代码。真实树形dp+最小生成树好题,就是做的头疼,哈哈。

代码

/* ACM Code written by Sam X or his teammates.* Filename: hdu4126.cpp* Date: 2018-11-18*/#include <bits/stdc++.h>#define INF 0x3f3f3f3f
#define PB emplace_back
#define MP make_pair
#define fi first
#define se second
#define rep(i,a,b) for(repType i=(a); i<=(b); ++i)
#define per(i,a,b) for(repType i=(a); i>=(b); --i)
#define ZERO(x) memset(x, 0, sizeof(x))
#define MS(x,y) memset(x, y, sizeof(x))
#define ALL(x) (x).begin(), (x).end()#define QUICKIO                  \ios::sync_with_stdio(false); \cin.tie(0);                  \cout.tie(0);
#define DEBUG(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)using namespace std;
using pi=pair<int,int>;
using repType=int;
using ll=long long;
using ld=long double;
using ull=unsigned long long;int n,m;struct Edge
{int u,v,w;Edge() {}Edge(int _u,int _v, int _w):u(_u), v(_v), w(_w) {}bool operator < (const Edge& rhs) const{if(w==rhs.w){return u<rhs.u;}else return w<rhs.w;}
};
const int MAXN=3005;
vector<Edge> edges;
int mat[MAXN][MAXN];
int used[MAXN][MAXN];int edges_ord[18000005];
int pa[MAXN];
vector<Edge> nedges;
vector<int> nG[MAXN];
inline void nadd_edge(int u,int v,int w)
{nedges.PB(u,v,w);nG[u].PB(int(nedges.size())-1);
}
int find_pa(int x)
{return pa[x]==x?x:pa[x]=find_pa(pa[x]);
}
inline void union_pa(int x,int y)
{int fx=find_pa(x),fy=find_pa(y);if(fx!=fy) pa[fx]=fy;
}
inline int kruskal()
{int ret=0;iota(pa,pa+n,0);sort(ALL(edges));rep(i,0,edges.size()-1){int u=edges[i].u,v=edges[i].v,w=edges[i].w;if(find_pa(u)!=find_pa(v)){union_pa(u,v);ret+=w;used[u][v]=used[v][u]=w;nadd_edge(u,v,w);nadd_edge(v,u,w);}}return ret;
}int dp[MAXN][MAXN];
int dfs(int root, int now, int pre)
{//cout<<root<<" "<<now<<" "<<pre<<endl;int ans=INF;rep(i,0,int(nG[now].size())-1){int& v=nedges[nG[now][i]].v;if(v!=pre){int tmp=dfs(root,v,now);ans=min(ans,tmp);dp[now][v]=dp[v][now]=min(dp[now][v], tmp);}}if(root!=pre && pre!=-1){ans=min(ans, mat[now][root]);}return ans;
}inline void init()
{edges.clear();nedges.clear();rep(i,0,n-1) nG[i].clear();MS(dp,0x3f);MS(used,-1);MS(mat,0x3f);
}int main()
{while(scanf("%d%d",&n,&m)==2){if(!n && !m) break;init();rep(i,0,m-1){int u,v,w;scanf("%d%d%d",&u,&v,&w);edges.PB(u,v,w);mat[u][v]=mat[v][u]=w;}int sum=kruskal();rep(i,0,n-1)dfs(i,i,-1);int q;scanf("%d",&q);double ans=0;rep(i,0,q-1){int u,v,w;scanf("%d%d%d",&u,&v,&w);if(used[u][v]!=-1) ans+=sum-used[u][v]+min(dp[u][v], w);else ans+=sum;}printf("%.4lf\n",ans/(1.0*q));}return 0;
}

转载于:https://www.cnblogs.com/samhx/p/HDU-4126.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450645.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学家吴文俊批判“中国式奥数”:害人害数学

奥数震动了两位最高科技奖得主 一谈起“奥数”&#xff0c;国内当今数学界的泰斗级人物吴文俊院士就急了。 他在沙发上挺直了腰&#xff0c;瞪大眼睛&#xff0c;伸出手掌指指点点&#xff1a;“是害人的&#xff0c;害数学&#xff01;” “什么奥林匹克&#xff1f;没这回事&…

CentOS 7 搭建CA认证中心实现https取证

CA认证中心简述CA &#xff1a;CertificateAuthority的缩写&#xff0c;通常翻译成认证权威或者认证中心&#xff0c;主要用途是为用户发放数字证书功能&#xff1a;证书发放、证书更新、证书撤销和证书验证。作用&#xff1a;身份认证&#xff0c;数据的不可否认性端口&#x…

简单明了 - Git 使用超详细教程

见&#xff1a;http://www.admin10000.com/document/5374.html 一&#xff1a;Git是什么&#xff1f; Git是目前世界上最先进的分布式版本控制系统。 二&#xff1a;SVN与Git的最主要的区别&#xff1f; SVN是集中式版本控制系统&#xff0c;版本库是集中放在中央服务器的&…

FileStream功能被禁用

今天还原数据库&#xff0c;遇到如下问题&#xff1a; 网上的解决方法大概是三种&#xff1a; 1、讲数据库备份文件权限设置为“EventOne” 2、打开SQLServer配置管理器&#xff0c;选中服务然后右击“属性”将FileStream相关勾选并重启当前实例服务 3、设置数据库访问级别 USE…

btree索引和hash索引的区别(待更新)

btreehash用于使用 , >, >, <, < 或者 BETWEEN 运算符的列比较。如果 LIKE 的参数是一个没有以通配符起始的常量字符串的话也可以使用这种索引仅仅能满足"","IN"和"<>"查询

window.parent,top,window.self,parent,opener

2019独角兽企业重金招聘Python工程师标准>>> 在应用有frameset或者iframe的页面时&#xff0c;parent是父窗口&#xff0c;top是最顶级父窗口&#xff08;有的窗口中套了好几层frameset或者iframe&#xff09;&#xff0c;self是当前窗口&#xff0c; opener是用ope…

ALM 中查看某个 test 的更改 history 历史

ALM 中要查看某个 test 更改历史&#xff0c; 需要下面两个表&#xff1a;AUDIT_LOG and AUDIT_PROPERTIES------- Get Test modification history -------- ---- In ALM, 857, if filter out test case named 26169502, check its History. In the history, for the node of d…

编译器vs.代码 谁之过

摘要&#xff1a;编译器是将程序语言编译成机器语言的一种高级程序。如今许多编译器越发智能&#xff0c;在编译不通过的情况&#xff0c;你的代码甚至都无法运行&#xff0c;那么到底是编译的问题还是您的代码问题呢&#xff1f; 许多程序员喜欢抱怨编译器报出的各做错误&…

Android 在 Google 开发者大会上发布了哪些更新? | Google 开发者大会 2018

有哪些新的 Android 系统特性 Google Play 上的 targetVersion 要求 2018年8月 新应用发布必须为26或者更高2018年11月 升级现有应用必须为26或者更高2019年之后 新发布或者升级应用必须为一年内发布的 Android 版本工信部已经出台相应的政策&#xff0c;中国主流的应用市场也已…

两个不同的数据库如何跨库事务

首先我们要明白同一实例&#xff0c;简单来说就是一个ip&#xff0c;如果两个数据库位于同一个ip&#xff0c;就是同一实例。其实实例并不相当于ip&#xff0c; 他其实相当于服务&#xff0c;也就是serve。 这样的两个或多个就可以跨库事务&#xff0c;比如 begin; insert in…

链表排序(冒泡、选择、插入、快排、归并、希尔、堆排序)

参考http://www.cnblogs.com/TenosDoIt/p/3666585.html 插入排序&#xff08;算法中是直接交换节点&#xff0c;时间复杂度O&#xff08;n^2&#xff09;,空间复杂度O&#xff08;1&#xff09;&#xff09; 1 class Solution {2 public:3 ListNode *insertionSortList(Lis…

zookeeper使用和原理探究

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 zookeeper介绍 zookeeper是一个为分布式应用提供一致性服务的软件&#xff0c;它是开源的Hadoop项目中的一个子项目&#xff0c;并且根据…

thinkphp如何部署到宝塔面板nginx服务器

原理&#xff1a;一般本地都会使用apache服务器&#xff0c;这个对pathinfo&#xff08;两个&#xff0c;一个是环境变量$_SERVER[PATH_INFO]&#xff0c;另一个是pathinfo函数&#xff09;路由解析非常支持的&#xff0c;不需要部署什么&#xff0c; 但是nginx是对pathinfo函…

Android获取所有应用的资源id和对应的uri

背景在某些应用中&#xff0c;为了实现应用apk资源放入重复利用&#xff0c;或者使用反射得到本应用的资源&#xff0c;需要使用反射方式获得&#xff0c;但Resources类中也自带了这种获取方式&#xff0c;并且功能更加强大你可以获取string,color,drawable,raw,xml等文件&…

nginx的脚本引擎(一)

nginx的脚本的语法和shell是很像的&#xff0c;我大致看了一下觉得挺有意思的&#xff0c;就想写写记录一下。我没看过shell脚本的引擎&#xff0c;不知道nginx脚本引擎和shell脚本引擎像不像&#xff0c;但是我觉得nginx的脚本引擎有点像C和汇编。 ngx_http_script_engine_t这…

一个待办事列表todolist

最近有位老师让我做的&#xff0c;图片在下面&#xff0c;做了4个多小时&#xff0c;ui有的简陋&#xff0c;可以再美化一下&#xff0c;这个会更好看&#xff0c;毕竟我也不是专业前端&#xff0c;测试网站http://todolist.sshouxin.top/使用的是thinkphp5.1的框架&#xff0c…

详细说明 SourceTree 免登录,跳过初始设置的方法(Windows 版 )

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 首先&#xff0c;安装完 SourceTree 以后先运行一次&#xff0c;弹出初始化登录页面后退出。 2. 进入这个文件夹&#xff1a;C:\Users…

什么是好的API设计?

摘要&#xff1a;有人言&#xff0c;API设计是编程工作中最难的事情。甚至有人认为至少要有10年的工作经验才能接触它。不过这里提出了一个引人思考的问题&#xff1a;究竟是构建什么样的库需要花费10年的时间去学习&#xff1f; 有人言&#xff0c;API设计是编程工作中最难的事…

Linux学习记录-文件、目录与磁盘

用户和群组 用户和群组主要是为了区分用户对文件的操作权限。 账号在/etc/passwd个人密码在/etc/shadow组信息在/etc/group 不要乱动这3个文件文件权限和目录配置 文件属性 文件前缀解释&#xff0c;例如&#xff1a; 第一个字符代表这个文件是『目录、文件或链接文件等等』&am…

php curl模拟https请求

https请求(支持GET和POST) function http_request($url,$data null){$curl curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if(!empty($data)){curl_setopt($cur…