「日常訓練」 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.pswp.cn/news/450645.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450645.shtml
英文地址,請注明出處:http://en.pswp.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…