【学习笔记】DAG / 一般有向图的支配树 / 灭绝树

定义与声明

一个有向图 GGG。给定一个起点 sss,假设 sss 能到达所有点。

若去掉某个点 iii 后,sss 无法到达 jjj,则称 iiijjj 的支配点。

显然支配点存在传递关系。

sss 为根,使得对于任意节点 iii,其树上祖先均为 iii 的支配点,这样的树称之为支配树。(有的人叫做灭绝树)

任一有向图都存在支配树,前提是满足 sss 能到达所有点。

支配树不一定是图 GGG 的树形图,即树上有些边不存在于图 GGG 中。


  • dfs\text{dfs}dfs 树。

对图 GGGdfs\text{dfs}dfs 树。每个点有一个 dfn\text{dfn}dfn 序,即 dfs\text{dfs}dfs 的时间戳。

dfs\text{dfs}dfs 树中的边称为树边,除此之外的原图中的边称为非树边。

非树边又分为前向边,返祖边,横叉边。前向边是 dfn\text{dfn}dfn 序小的连向大的,返祖边和横叉边则相反。

  • 最近支配点 idom\text{idom}idom

iii 的支配点中 dfn\text{dfn}dfn 序最大的点,即支配树上 iii 的父亲。

注意:支配树上的父亲不一定就是 dfs\text{dfs}dfs 树上的父亲。

显然,除 sss 以外的所有点均有唯一的 idom\text{idom}idom

  • 半支配点 sdom\text{sdom}sdom

vvv 的半支配点 uuu 是满足『 GGG 中存在一条从点 uuu 到点 vvv 的路径,且路径上经过点的 dfn>dfn[v]\text{dfn}>\text{dfn}[v]dfn>dfn[v](不包含 u,vu,vu,v)』的dfn\text{dfn}dfn 最小的点。

uuu 只走非树边能到达 vvvdfn\text{dfn}dfn 最小的 uuu

特别的,如果 uuu 有一条边直接连向 vvv,则也是 sdom(v)\text{sdom}(v)sdom(v) 的候选点,这相当于路径上没有其他点。

u→v:uu\rightarrow v:uuv:u 存在一条直接连向 vvv 的边。

u⇝^v:u\hat\leadsto v:u^v: 存在一条由树边组成的 uuuvvv 的路径,且 u≠vu\ne vu=v

u⇝¨v:u\ddot\leadsto v:u¨v: 存在一条由树边组成的 uuuvvv 的路径,允许 u=vu=vu=v

注意:下面引理和定理的树均指 dfs\text{dfs}dfs 树,而非支配树。树边/非树边也是在 dfs\text{dfs}dfs 树的基础上定义的。


引理与定理

  • 引理Ⅰ:∀i≠s\forall_{i\ne s}i=sidom(i)⇝^i\text{idom}(i)\hat\leadsto iidom(i)^iidom(i)\text{idom}(i)idom(i) 一定是 dfs\text{dfs}dfs 树上 iii 的某个祖先点。

    显然。如果不是,那么去掉 idom(i)\text{idom(i)}idom(i) 后,sss 可以通过走树边访问到 iii。这就不满足『支配 』的定义了。

  • 引理Ⅱ:∀i≠s\forall_{i\ne s}i=ssdom(i)⇝^i\text{sdom}(i)\hat\leadsto isdom(i)^isdom(i)\text{sdom(i)}sdom(i) 一定是 dfs\text{dfs}dfs 树上 iii 的某个祖先点。

    假设 sdom(i)\text{sdom}(i)sdom(i) 不是 iii 的祖先,那么我们可以从 sdom(i)\text{sdom}(i)sdom(i) 开始沿着树边往上走,直到走到 iii 的某个祖先点 xxx 上。

    这期间肯定不会经过除 xxx 外的任何一个 iii 的祖先点。

    显然 xxx 更符合 sdom\text{sdom}sdom 的条件。

  • 引理Ⅲ:∀i≠s\forall_{i\ne s}i=sidom(i)⇝¨sdom(i)\text{idom}(i)\ddot\leadsto\text{sdom}(i)idom(i)¨sdom(i)idom(i)\text{idom}(i)idom(i) 要么是 sdom(i)\text{sdom}(i)sdom(i),要么是 sdom(i)\text{sdom}(i)sdom(i) 的祖先。

    通过前面的引理,我们知道 idom(i),sdom(i)\text{idom}(i),\text{sdom}(i)idom(i),sdom(i) 一定都在支配树中 iii 到根的路径上,即是 iii 的某个祖先点。

    所以引理如果不成立,我们就可以从 sss 直接走到 sdom(i)\text{sdom(i)}sdom(i) 然后走到 iii,且没有经过 idom(i)\text{idom}(i)idom(i)

    这显然不符合 idom(i)\text{idom}(i)idom(i) 的定义。所以引理一定成立。

  • 引理Ⅳ:∀u⇝¨v\forall\ u\ddot\leadsto v u¨v ,有 u⇝¨idom(v)u\ddot\leadsto \text{idom}(v)u¨idom(v)idom(v)⇝¨idom(u)\text{idom}(v)\ddot\leadsto\text{idom}(u)idom(v)¨idom(u)

    u,v,idom(u),idom(v)u,v,\text{idom}(u),\text{idom}(v)u,v,idom(u),idom(v) 都在根到某个叶子节点的路径上。

    引理也就是说这两条 idom(x)\text{idom}(x)idom(x)xxx 的路径完全不交或包含。

    分情况讨论:

    • dfn[u]≤dfn[idom(v)]\text{dfn}[u]\le \text{dfn}[\text{idom}(v)]dfn[u]dfn[idom(v)]

      此时有 u⇝¨idom(v)⇝¨vu\ddot\leadsto \text{idom(v)}\ddot\leadsto vu¨idom(v)¨v。完全不交。

    • dfn[u]>dfn[idom(v)]\text{dfn}[u]>\text{dfn}[\text{idom}(v)]dfn[u]>dfn[idom(v)]

      此时有 idom(v)⇝¨u\text{idom}(v)\ddot\leadsto uidom(v)¨u

      然后要么有 idom(u)⇝¨idom(v)\text{idom}(u)\ddot\leadsto \text{idom}(v)idom(u)¨idom(v),要么有 idom(v)⇝¨idom(u)\text{idom}(v)\ddot\leadsto \text{idom}(u)idom(v)¨idom(u)

      如果 idom(u)⇝¨idom(v)\text{idom}(u)\ddot\leadsto \text{idom}(v)idom(u)¨idom(v),那么去掉 idom(v)\text{idom}(v)idom(v)idom(u)\text{idom}(u)idom(u) 一定还能到达 uuu,否则 idom(u)\text{idom(u)}idom(u) 就不是 uuu 的支配点,而 idom(v)\text{idom}(v)idom(v) 才是了。

      所以也一定能到达 vvv。这样又不符合 idom(v)\text{idom}(v)idom(v) 的定义了。矛盾。

      所以有 idom(v)⇝¨idom(u)\text{idom}(v)\ddot\leadsto \text{idom}(u)idom(v)¨idom(u)。包含。

  • 定理Ⅰ:∀u≠s\forall\ u\ne s u=s,如果 sdom(u)⇝^v⇝¨u∧dfn[sdom(v)]≥dfn[sdom(u)]\text{sdom}(u)\hat\leadsto v\ddot\leadsto u\ \wedge\ \text{dfn}[\text{sdom}(v)]\ge\text{dfn}[\text{sdom}(u)]sdom(u)^v¨u  dfn[sdom(v)]dfn[sdom(u)],则有 idom(u)=sdom(u)\text{idom}(u)=\text{sdom}(u)idom(u)=sdom(u)

    前提条件意思就是:

    对于所有满足 sdom(u)\text{sdom}(u)sdom(u)vvv 祖先,vvvuuu 祖先(可以相等)的 vvv,均满足 sdom(u)\text{sdom(u)}sdom(u)uuu 的路径完全包含 sdom(v)\text{sdom}(v)sdom(v)vvv 的路径。

  • 定理Ⅱ:∀u≠s\forall\ u\ne s u=s,如果 sdom(u)⇝^v⇝¨u\text{sdom}(u)\hat\leadsto v\ddot\leadsto usdom(u)^v¨u,假设 vvvdfn[sdom(v)]\text{dfn}[\text{sdom(v)}]dfn[sdom(v)] 最小的点,

    且如果 dfn[sdom(v)]<dfn[sdom(u)]\text{dfn}[\text{sdom}(v)]<\text{dfn}[\text{sdom}(u)]dfn[sdom(v)]<dfn[sdom(u)],则有 idom(u)=idom(v)\text{idom}(u)=\text{idom(v)}idom(u)=idom(v)

    • 结合以上两个定理有,推论Ⅰ:∀u≠s\forall\ u\ne s u=s,令 uuu 为所有满足 sdom(v)⇝^u⇝¨v\text{sdom}(v)\hat\leadsto u\ddot\leadsto vsdom(v)^u¨vuuudfn[sdom(u)]\text{dfn}[\text{sdom}(u)]dfn[sdom(u)] 最小的点。

      idom(v)={sdom(v)sdom(u)=sdom(v)idom(u)sdom(u)<sdom(v)\text{idom}(v)=\begin{cases}\text{sdom}(v)&\text{sdom}(u)=\text{sdom}(v)\\\text{idom}(u)&\text{sdom}(u)<\text{sdom}(v)\end{cases}idom(v)={sdom(v)idom(u)sdom(u)=sdom(v)sdom(u)<sdom(v)

  • 定理Ⅲ:∀u≠s\forall\ u\ne s u=s,有 sdom(u)=min⁡{v∣(v,u)∈E,v<u}\text{sdom}(u)=\min\Big\{v\mid (v,u)\in E\ ,\ v<u\Big\}sdom(u)=min{v(v,u)E , v<u}

    sdom(u)\text{sdom}(u)sdom(u) 的候选点只用考虑两类:

    • 由树边或者前向边直接连过来的点。
    • dfn\text{dfn}dfn 更大的且与 uuu 有边相连的点及其祖先的 sdom\text{sdom}sdom。这又可以分为两类:
      • dfn[v]>dfn[u],∃(v,u)∈E\text{dfn}[v]>\text{dfn}[u],\exist(v,u)\in Edfn[v]>dfn[u],(v,u)E,则 sdom(v)\text{sdom}(v)sdom(v) 一定是 sdom(u)\text{sdom}(u)sdom(u) 的一个候选点。
      • 满足 dfn[v]>dfn[u],∃(v,u)∈E\text{dfn}[v]>\text{dfn}[u],\exist(v,u)\in Edfn[v]>dfn[u],(v,u)Evvv 的部分祖先,且这些祖先的 dfn>dfn[u]\text{dfn}>\text{dfn}[u]dfn>dfn[u],则这些祖先的 sdom\text{sdom}sdom 也是候选点。

定理Ⅰ,Ⅱ实在不会证明,感性理解好了,直接开始摆烂

大本钟下寄快递,上面开摆下面寄


算法步骤

建立支配树的算法步骤:

  • 如果对于一棵树,树根为 sss,那么这棵树本身就是一棵支配树。

  • 如果是一个 DAG\text{DAG}DAG ,则可以拓扑排序。然后依次确定每个点的 idom\text{idom}idom

    设当前点为 iii,有 j→ij\rightarrow iji,则所有 jjj 在支配树中的 LCA\text{LCA}LCA 就是 idom(i)\text{idom}(i)idom(i)

    拓扑+++倍增时间大概 O((n+m)log⁡n)O((n+m)\log n)O((n+m)logn)

  • 如果是一般图问题,则可以先求出每个点的 sdom\text{sdom}sdom,然后对所有点,连边 (sdom(i),i)(\text{sdom}(i),i)(sdom(i),i),去掉非树边,就形成了 DAG\text{DAG}DAG。支配关系与原图一致。


代码实现

DAG\text{DAG}DAG 模板题:ZJOI2012 灾难

代码实现:

#include <bits/stdc++.h>
using namespace std;
#define maxn 66000
int dep[maxn], deg[maxn], f[maxn][20], siz[maxn];
vector < int > pre[maxn], G[maxn], rG[maxn];
queue < int > q;
int n;void dfs( int u, int fa ) {siz[u] = 1;for( int v : rG[u] ) if( v ^ fa ) dfs( v, u ), siz[u] += siz[v];
}int LCA( int u, int v ) {if( dep[u] < dep[v] ) swap( u, v );for( int i = 19;~ i;i -- ) if( dep[f[u][i]] >= dep[v] ) u = f[u][i];if( u == v ) return u;for( int i = 19;~ i;i -- ) if( f[u][i] ^ f[v][i] ) u = f[u][i], v = f[v][i];return f[u][0];
}int main() {scanf( "%d", &n );for( int i = 1, x;i <= n;i ++ ) {while( ~ scanf( "%d", &x ) and x ) //G[x]:x有dfs树路径到的点的集合G[x].push_back( i ), deg[i] ++;}int root = 0; //新建大起点 即使其变成有根树//pre[i]:i的前驱集合 即从根开始有dfs树路径到i的点for( int i = 0;i <= n;i ++ )if( ! deg[i] ) pre[i].push_back( root ), q.push( i );while( ! q.empty() ) {int u = q.front(); q.pop();int lca = pre[u][0];for( int x : pre[u] ) lca = LCA( lca, x );dep[u] = dep[lca] + 1;f[u][0] = lca;//建立支配树上的关系for( int i = 1;i < 20;i ++ )f[u][i] = f[f[u][i - 1]][i - 1];rG[lca].push_back( u );for( int v : G[u] ) {pre[v].push_back( u );//u是v的前驱之一if( ! -- deg[v] ) q.push( v );}}dfs( root, -1 );for( int i = 1;i <= n;i ++ ) printf( "%d\n", siz[i] - 1 );return 0;
}

一般有向图模板题:luogu-P5180 【模板】支配树

代码实现:

#include <queue>
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
#define maxn 200005
struct node {vector < int > g[maxn];void AddEdge( int u, int v ) {g[u].push_back( v );}
}G, rG, Dfs, rDfs, dominate;//原图 反图 dfs树 反dfs树 支配树
queue < int > q;
int n, m, cnt;
int id[maxn], dfn[maxn], fa[maxn], anc[maxn], min_anc[maxn], sdom[maxn], d[maxn], dep[maxn], ans[maxn];
int f[maxn][20];
/*
Semi-domination半支配 表示v点的所有半支配点的最小的那个
半支配点:
存在从一个点u到v的路径中(不包括u,v),所有dfs树的点的dfn都大于v的dfn
如果u是v在dfs树上的父节点,那么u也是v的半支配点
*/void dfs( int u ) {//寻找dfs树id[dfn[u] = ++ cnt] = u; //打时间戳for( int i = 0;i < G.g[u].size();i ++ ) {int v = G.g[u][i];if( dfn[v] ) continue; else;fa[v] = u;Dfs.AddEdge( u, v );dfs( v );}
}int find( int x ) {if( x == anc[x] ) return x;int father = anc[x];anc[x] = find( anc[x] );if( dfn[sdom[min_anc[x]]] > dfn[sdom[min_anc[father]]] )min_anc[x] = min_anc[father];// min_anc表示x到sdom[x]路径上dfn[sdom]值最小的点return anc[x];
}void build_dfs() {//建立与原图等价的DAGfor( int i = 1;i <= n;i ++ )anc[i] = min_anc[i] = sdom[i] = i;for( int i = n;i > 1;i -- ) {int u = id[i];if( ! dfn[u] ) continue;int t = n;for( int j = 0;j < rG.g[u].size();j ++ ) {int v = rG.g[u][j];if( dfn[v] < dfn[u] )t = min( t, dfn[v] );else {find( v );t = min( t, dfn[sdom[min_anc[v]]] );}}sdom[u] = id[t];anc[u] = fa[u];Dfs.AddEdge( sdom[u], u );}
}int lca( int u, int v ) {if( ! u || ! v ) return u + v;if( dep[u] < dep[v] ) swap( u, v );for( int i = 19;~ i;i -- )if( dep[f[u][i]] >= dep[v] ) u = f[u][i];if( u == v ) return u;for( int i = 19;~ i;i -- )if( f[u][i] != f[v][i] ) u = f[u][i], v = f[v][i];return f[u][0];
}void build_dominate( int u ) {int t = 0;for( int i = 0;i < rDfs.g[u].size();i ++ ) {int v = rDfs.g[u][i];t = lca( t, v );}dep[u] = dep[t] + 1;dominate.AddEdge( t, u );f[u][0] = t;for( int i = 1;i < 20;i ++ )f[u][i] = f[f[u][i - 1]][i - 1];
}void topo() {for( int i = 1;i <= n;i ++ )for( int j = 0;j < Dfs.g[i].size();j ++ ) {int k = Dfs.g[i][j];d[k] ++;rDfs.AddEdge( k, i );}for( int i = 1;i <= n;i ++ )if( ! d[i] ) {Dfs.AddEdge( 0, i );rDfs.AddEdge( i, 0 );}q.push( 0 );while( ! q.empty() ) {int u = q.front(); q.pop();for( int i = 0;i < Dfs.g[u].size();i ++ ) {int v = Dfs.g[u][i];if( -- d[v] <= 0 ) {build_dominate( v );q.push( v );}}}
}void work( int u ) {ans[u] = 1;for( int i = 0;i < dominate.g[u].size();i ++ ) {int v = dominate.g[u][i];work( v );ans[u] += ans[v];}
}int main() {scanf( "%d %d", &n, &m );for( int i = 1, u, v;i <= m;i ++ ) {scanf( "%d %d", &u, &v );G.AddEdge( u, v );rG.AddEdge( v, u );}dfs( 1 );build_dfs();topo();work( 0 );for( int i = 1;i <= n;i ++ )printf( "%d ", ans[i] );return 0;
}

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

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

相关文章

[ZJOI2014] 星系调查(树上差分 + 数学推式子)

problem luogu-P3340 题面写得那么长&#xff0c;其实说白了就是求一条直线&#xff0c;使得若干个点到这条直线的距离平方的和最小&#xff0c;求这个最小值。 solution 我超爱数学&#xff0c;数学就是我的命&#xff0c;我一天不学数学我就难受&#xff01; 假设拟合出…

[ZJOI2014] 璀璨光华(bfs建图 + dfs搜索)

problem luogu-P3342 solution 你感觉这道题没考什么&#xff0c;又感觉考了什么 通过样例以及题面&#xff0c;我们并未获取到『立方体每个小方块的编号是按一定规则命名』的信息。 也就是说&#xff0c;我们需要通过输入的每个小方块相邻的编号的信息来建出这个立方体的…

cf1523A. Game of Life

cf1523A. Game of Life 题意&#xff1a; 包含n个元素的数组&#xff0c;数值为1或0&#xff0c;如果一个元素为0&#xff0c;并且其周围正好只有一个为1的元素&#xff0c;那么下一刻本元素也会变成1. 给你一个数值&#xff0c;问你m次时刻后数组的状态 题解&#xff1a; …

SignalR 中丰富多彩的消息推送方式

在上一篇 SignalR 文章中&#xff0c;演示了如何通过 SignalR 实现了简单的聊天室功能&#xff1b;本着简洁就是美的原则&#xff0c;这一篇我们也来聊聊在 SignalR 中的用户和组的概念&#xff0c;理解这些基础知识有助于更好的开发基于 SignalR 的应用&#xff0c;通过对用户…

Visual Studio 2019 使用 Live Share

一.前言Visual Studio 2019 在今天发布&#xff08;北京时间&#xff09;了&#xff0c;这次带来了一个比较有趣的 Live Share 功能&#xff0c;使用它可以进行更好的协作开发。主要功能&#xff1a;更多资料可看官方介绍&#xff1a;Visual Studio 实时共享什么是Visual Studi…

cf1523B. Lord of the Values

cf1523B. Lord of the Values 题意&#xff1a; 给你一个数组&#xff0c;有n个数&#xff0c;n为偶数&#xff0c;a1&#xff0c;a2…an 现在有两个操作&#xff1a; 对于i<j 操作1&#xff1a;aiaiaj 操作2&#xff1a;ajaj-ai 把原数组转换为-a1,-a2,-a3… 题解&#…

Asp.Net Core WebAPI使用Swagger时API隐藏与分组

1、前言为什么我们要隐藏部分接口&#xff1f;因为我们在用swagger代替接口的时候&#xff0c;难免有些接口会直观的暴露出来&#xff0c;比如我们结合Consul一起使用的时候&#xff0c;会将健康检查接口以及报警通知接口暴露出来&#xff0c;这些接口有时候会出于方便考虑&…

cf1526E. Oolimry and Suffix Array(未解决)

E. Oolimry and Suffix Array 题意&#xff1a; 给定n&#xff0c;k和长度为n的后缀数组si(0<si<n-1),求长度为n的由k种字母构成的字符串种&#xff0c;后缀数组为si的有多少种 题解&#xff1a; 题解看懂了一半。。。等会了再更新 代码&#xff1a;

P2572 [SCOI2010]序列操作

P2572 [SCOI2010]序列操作 题意&#xff1a; 一个长度为n的01序列&#xff0c;下标从0开始&#xff0c;现在有五种变换操作和询问操作&#xff1a; 0 l r 把[l,r]区间内的所有数全变成01 l r 把[l,r]区间内的所有数全变成12 l r把[l,]区间内所有数全部取反3 l r询问[l,r]区间…

为您的机器配置开发环境

软件准备在本期视频中&#xff0c;我们将安装所序言的软件&#xff0c;并为我们的电脑配置.NET Core开发环境。我们需要安装如下2个软件&#xff1a;一个编辑器.NET Core SDK&#xff08;Software Development Kit&#xff09;下载并安装.NET Core 开发编辑器我的是Windows操作…

[CQOI2012] 局部极小值(状压DP + 容斥 + 搜索)

problem luogu-P3160 solution 这么小的数据范围&#xff0c;非暴力不状压。暴力 O(28!)O(28!)O(28!) 呵呵呵可以拉走了。 我们不妨从小到大填数字&#xff0c;这样如果局部极小值点还没有填的话&#xff0c;周围的九宫格就一定不能被填。 设 dp(s,i):dp(s,i):dp(s,i): 局…

基于Kubernetes 构建.NET Core 的技术体系

很多公司技术支持岗位的工作&#xff0c;如配置域名&#xff0c;部署环境&#xff0c;修改复位配置&#xff0c;服务重启&#xff0c;扩容缩容&#xff0c;梳理和完善监控&#xff0c;根据开发的需要查找日志等工作&#xff0c;需要和开发进行大量的沟通&#xff0c;如什么是外…

P4062 [Code+#1]Yazid 的新生舞会(分治做法)

P4062 [Code#1]Yazid 的新生舞会 题意&#xff1a; 给出一个序列&#xff0c;求有多少个子区间满足众数的出现次数大于区间长度的一半。 出现次数大于区间长度的一般我们称之为绝对众数 题解&#xff1a; 分治做法 对于一个区间[l,r]&#xff0c;设mid⌊lr2⌋\lfloor \frac…

[CQOI2014] 危桥(网络流)

problem luogu-P3163 solution 这是一道网络流好题&#xff0c;看的着摸不着吃不着。 初读完题&#xff0c;就知道这是一道“脱光了”的最大流。 建图基础版本&#xff1a; 建立额外源汇点。 无向边相同于两条有向边&#xff0c;直接建不影响&#xff0c;危桥流量设成 22…

那些优秀的开发者----汪宇杰:从重视细节,到成就技术专家

汪宇杰&#xff08;Edi Wang&#xff09;&#xff0c;.NET及Windows开发者&#xff0c;2018-2019年度微软最有价值专家&#xff08;Windows Development方向&#xff09;。现担任某金融科技企业的网站开发工程师。他对微软技术有鉴定的信念和不灭的热情&#xff0c;曾在Windows…

P4062 [Code+#1]Yazid 的新生舞会(线段树做法)

P4062 [Code#1]Yazid 的新生舞会&#xff08;线段树做法&#xff09; 题意&#xff1a; 给你一个序列a[1…n]​&#xff0c;求存在绝对众数的子区间个数。 绝对众数指&#xff1a;区间中出现次数最多的那个数&#xff0c;出现次数严格大于区间长度的一半。 题解&#xff1a…

《从零开始学ASP.NET CORE MVC》课程介绍

大家好&#xff0c;欢迎来到52ABP学院&#xff0c;收看我们的 《从零开始学ASP.NET CORE MVC》。ASP.NET Core 简介从2015年开始随时互联网成长&#xff0c;云计算和AI、大数据的爆发&#xff0c;大家从谈论项目信息化到数字化的转型&#xff0c;从ToC产业到ToB产业的转型&…

[ZJOI2015] 地震后的幻想乡(状压dp + 期望)

problem luogu-P3343 solution dp(i):dp(i):dp(i): 当恰好加入第 iii 小边时候&#xff0c;所有点联通的方案数。 则 ans∑idpi(mi)im1ans\sum_i \frac{dp_i}{\binom mi}\frac{i}{m1}ans∑i​(im​)dpi​​m1i​ 。 重点是如何计算出 dp(i)dp(i)dp(i)。 这个恰好的限制不好…

P2152 [SDOI2009]SuperGCD

P2152 [SDOI2009]SuperGCD 题意&#xff1a; 求a和b的最大公约数 a,b<101000010^{10000}1010000 题解&#xff1a; 高精度&#xff0c;java高精度直接有模板&#xff0c;c高精度结合gcd的辗转相减法 对于&#xff1a;a,b的gcd(a,b)有&#xff1a; 若a为奇数&#xff0c…

Docker - 容器部署 Consul 集群

目录 准备 Consul 镜像安装单个 Consul组装集群 Consul启动 Consul 和 Web 管理器Consul 命令简单介绍Web 管理器Server 加入集群Client 加入集群了解 ConsulConsul 使用场景Consul 优势Consul 中的概念说明简介安装总结引用和附件说明本文主要介绍怎么使用 Docker 在 Linux…