生成树
issue是fw
19 years old, struggling in life, chasing daydreams.
展开
-
Transfer water HDU - 4009(最小树形图)
传送门前前后后调了几个小时,交了303030发…原来板子是没错的,但是如果虚根是000那么每次的编号就要从000起对应的visvisvis和ididid数组就不能判断是否为000每次更新点数也要变化…下次绝对不用下标000的了…我吐了#include <bits/stdc++.h>using namespace std;const int maxn = 2e6+10;const int inf = 2e9;int n,m,root,X,Y,Z,top;int x[maxn原创 2020-11-13 13:24:49 · 222 阅读 · 0 评论 -
HDU 2121 Ice_cream’s world II(无根的最小树形图)
HDU2121无根的话,建立虚点n+1n+1n+1n+1n+1n+1向其他节点连一条边权足够大的边求以n+1n+1n+1为根的树形图,只会包含一条这种边权超大的边最后减去即可.#include <bits/stdc++.h>using namespace std;const int maxn = 4e5+10; const int inf = INT_MAX;int n,m,ansnum;int id[maxn],vis[maxn],pre[maxn],inw[maxn];原创 2020-11-09 18:31:38 · 222 阅读 · 0 评论 -
POJ - 3164 Command Network(最小树形图模板)
VJ传送门模板,但我还不是很熟练…在我理解来,最小树形图就是不断贪心的过程每一轮都筛选出n−1n-1n−1条边检查是否成环,不成环就是最小树形图成环需要进行缩点…#include <iostream>#include <cstring>#include <cmath> #include <stdio.h>using namespace std;const int maxn = 2e5+10;const int inf = 2e9;co原创 2020-11-09 16:06:26 · 221 阅读 · 0 评论 -
HDU6836 Expectation(矩阵树定理)
hdu传送门题意首先定义了一棵生成树的重量:这棵树所有边的按位与(AND)给出一个无向连通图,随机挑选一个生成树,问这个生成树的重量的期望是多少。矩阵树定理求的是∑T∏e∈Twe\sum\limits_{T}\prod_{e\in T}w_eT∑e∈T∏we期望就是总权值除以生成树的个数个数可以让边权为一来求解总权值不好搞,但是andandand操作可以拆分为二进制来看对于每一位二进制来说不是111就是000这样就可以使用矩阵树定理来求解每一位的贡献#include <bi原创 2020-11-07 16:18:27 · 241 阅读 · 0 评论 -
P4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理+容斥)
P4336 [SHOI2016]黑暗前的幻想乡我们知道矩阵树定理求的是∑T∏e∈Twe\sum\limits_{T}\prod_{e\in T}w_eT∑e∈T∏we当wew_ewe为111时求的就是生成树的方案数所以对所有边跑一边矩阵树定理求出方案数但是这个方案数肯定是算多了的因为可能是只由n−2,n−3...1n-2,n-3...1n−2,n−3...1个公司修建的那么我们枚举子集n−2n-2n−2个公司,再跑一遍矩阵树,减去这些答案那么由n−2n-2n−2个公司的方案确实被减掉原创 2020-11-05 20:03:49 · 301 阅读 · 0 评论 -
P3317 [SDOI2014]重建(矩阵树定理推式子变形)
P4336 [SHOI2016]黑暗前的幻想乡非常巧妙矩阵树定理求的是,其中TTT为所有生成树的集合∑T∏e∈Tpe\sum\limits_{T}\prod_{e\in T}p_eT∑e∈T∏pe也就是所有生成树所有边的积的和.但是现在要求的是∑T(∏e∈Tpe∏e∉T(1−pe))\sum\limits_{T}(\prod_{e\in T}p_e\prod_{e\notin T}(1-p_e))T∑(e∈T∏pee∈/T∏(1−pe))可以化简得到∑T(∏e∈Tpe∏e(1原创 2020-11-05 18:41:54 · 216 阅读 · 0 评论 -
【模板】Matrix-Tree 定理
洛谷的模板传送门前置知识:我们用到的矩阵,也就是基尔霍夫矩阵的任意一个代数余子式是所有生成树的边权积的和。当所有边边权为1时求的就是生成树的个数了。若边权不为111,求的就是定义其一个生成树 TT 的权值为 TT 中所有边权的乘积。所有不同生成树的权值之和做法我们以下设(x,y,z)(x,y,z)(x,y,z)为xxxxxx到yyyyyy有一条边权为zzzzzz的无向/有向 边。1.无向图假设现在给定一个图 GGG .度数矩阵D:若存在边(x,y,z)(x,y,z)(x,y,z),则原创 2020-11-05 09:21:01 · 262 阅读 · 0 评论 -
Qin Shi Huang‘s National Road System(次小生成树变形)
VJ传送门最小化AB\frac{A}{B}BA先求一遍最小生成树,设权值为mstmstmst现在枚举边(u,v)(u,v)(u,v),权值为www如果魔法路在生成树上,(pu+pv)/(mst−w)(p_u+p_v)/(mst-w)(pu+pv)/(mst−w)如果魔法路不在生成树上,(pu+pv)/(mst−maxx)(p_u+p_v)/(mst-maxx)(pu+pv)/(mst−maxx)其中maxxmaxxmaxx是最小生成树上u−>vu->vu−>v的最大边原创 2020-10-30 16:16:01 · 202 阅读 · 0 评论 -
The Unique MST POJ - 1679(判断唯一最小生成树)
VJ传送门直接套次小生成树的板子看一下和最小生成树是不是相同就可以了#include <iostream>#include <algorithm>using namespace std;#define int long longconst int maxn=2e5+10; const int inf=1e18;int n,m;int pre[maxn],deep[maxn],lg[maxn],ok[maxn];int fa[maxn][21],maxx[maxn原创 2020-10-30 15:04:40 · 213 阅读 · 0 评论 -
次小生成树算法(严格LCA)
有定理存在次小生成树,只替换最小生成树的一条边得来。那么先跑一遍最小生成树然后枚举不在树边的边(u,v)(u,v)(u,v)假如加入这条边,树就会成环,我们需要删掉u−>vu->vu−>v的一条树边显然删掉最大的那条边最优秀这个过程使用LCALCALCA来优化严格次小生成树模板题#include <bits/stdc++.h>using namespace std;#define int long longconst int maxn=2e5+10; c原创 2020-10-30 11:44:30 · 562 阅读 · 0 评论