洛谷 - P3469 - BLO-Blockade - 割点】的更多相关文章

P3469 [POI2008]BLO-Blockade https://www.luogu.org/problem/P3469 题目描述 There are exactly nn towns in Byteotia. Some towns are connected by bidirectional roads. There are no crossroads outside towns, though there may be bridges, tunnels and flyovers. Ea…
https://www.luogu.org/problem/P3469 翻译:一个原本连通的无向图,可以删除图中的一个点,求因为删除这个点所导致的不连通的有序点对的数量.或者说,删去这个点之后,各个连通分量的大小的乘积之和? 当然是考虑新学的Tarjan法求割点.一遍Tarjan给每个点记录他是不是割点.然后第二遍的时候对每个割点,统计它分割出的各个子树(及其父亲,假如有的话)这些连通块之间的贡献. 注意无向图是不需要栈的,因为无向图不存在横向边的说法. 错误代码: #include<bits/…
题目链接 题意:一个无向联通图,求删去每个点及其所有边后有多少有序点对的连通性发生了变化. Tarjan求割点的例题.. 如果当前点不是割点,那么它对整个图的连通性不产生影响,只有自己与其他\(n-1\)个点的连通性发生了变化,故答案为\((n-1)\times2\). 如果当前点是割点,那么除了自身外,它所连接的所有连通块和其他连通块之间的连通性都发生了变化,故答案为: 设\(size[u]\)表示以u为根的连通块的大小,与当前点相连的共有\(k\)个连通块, \[ans=\sum_{i=1}…
题目大意:给定 N 个点,M 条边的联通无向图,求出对于每个点来说,将与这个点相连的所有边都去掉后,会少多少个联通的点对 (x,y). 题解:连通性问题从 DFS 树的角度进行考虑.对于 DFS 树当前的节点来说,若其子节点的 low[] 大于等于子树根节点的时间戳,则将该节点的边去掉后,以该子树的孩子节点为根的子树会和其余部分不连通,会对答案产生一个贡献.诸如此类分析即可得到总共的答案. 代码如下 #include <bits/stdc++.h> using namespace std; c…
P3469[POI2008]LO-Blockade 题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每两个城镇之间至多只有一条直接连接的道路.人们可以从任意一个城镇直接或间接到达另一个城镇. 每个城镇都有一个公民,他们被孤独所困扰.事实证明,每个公民都想拜访其他所有公民一次(在主人所在的城镇).所以,一共会有n*(n-1)次拜访. 不幸的是,一个程序员总罢工正在进行中,那些程序员迫切要求购买某个软件.…
题目 割点模板题. 可以将图中的所有点分成两部分,一部分是去掉之后不影响图的连通性的点,一部分是去掉之后影响连通性的点,称其为割点. 然后分两种情况讨论,如果该点不是割点,则最终结果直接加上2*(n-1).如果是的话,就求子树的每块连通块大小. 一个点的子树可以分成两类:存在返祖边或不存在. 对于前者,割掉该点并不影响连通性,所以和祖先算作一个联通块: 对于后者,割掉该点将使得其变为独立的联通块,所以在搜索时顺便计算\(size\). 于是可以方便地算出后者的\(size\)之和sum,而前者总…
BLO-Blockade 题目链接 若一个点为割点:统计出每个子树的大小,两两相乘再相加, 再加上n-1,为这个点与其他点的拜访数, 因为拜访是互相的,最后再乘二即可 若一个点不是割点:只有(n-1)*2次拜访会受影响 #include<cstdio> #define LL long long #define N 100010 #define M 1000010 #define min(a,b) ((a)<(b)?(a):(b)) int n,m,dfn[N],low[N],size[N…
[模板]割点 割点集合:一个顶点集合V,删除该集合的所有定点以及与这些顶点相连的边后,原图不连通,就称集合V为割点集合 点连通度:最小割点集合中的顶点数 边连通度:最小割边集合中的边数 割点:割点集合中唯一的一个元素 Tarjan求缩点: 一个点为缩点的条件: 1.该点为根,搜索树中有大于1个子树 2.该点u不为根,存在儿子v,dfn[u]>low[v] #include<iostream> #include<cstring> #include<cstdio> u…
割点 首先 tarjan 求割点, 对于不是割点的点, 答案是 2 * (n-1) 有序,所以要乘 2 对于是割点的点, 答案是删去该点后所有连通块的个数加上 n-1 在乘 2 #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define ll long long using namespace std;…
一道经典的割点例题,用size数组记录该子树有多少个节点,sum是这棵搜索树上有多少个节点,sum*(n-sum-1)是将点删掉后的数对数量. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 1000010 using namespace std; typedef long long ll; inline int read() { ;…