[TK] BLO
初步分析
此题描述让我们想到Tarjan求割点,因此我们从割点的角度来探讨一下这道题.
假如我们去掉的不是一个割点,那么它实际上不会对连通性造成影响,但是根据样例可以看出来,删去这个点导致了其余点与当前点无法联通,即答案为 \(2\ (n-1)\).
假如我们去掉的点是一个割点,那么它必然会将整张图分成 \(k\) 部分,我们设第 \(i\) 部分的节点数是 \(s_{i}\),那么显然 部分 \(i\) 与其他部分中的每一个节点都不连通, 假如现在在部分 \(i\) 内有一个节点 \(A\),与它联通的节点数量等于 \(i\) 内其他节点数量,即 \(s_{i}-1\),又已知当前节点总数为 \(n-1\),那么与它不连通的节点数量即为 \((n-1)-(s_{i}-1)=n-s_{i}\). \(i\) 内所有点都满足这一点,因此 \(i\) 内的不连通节点对数 \(C_{i}\) 必然满足
\]
再加上删去 \(i\) 节点导致其他点与 \(i\) 不连通,对于全部不连通的节点数量 \(C\) ,有
\]
但是有一个问题,即通过上述代码得到的结果有部分数据偏小,说明我们还有未考虑到的部分.
来看一组样例
点击查看
5 5
1 2
2 3
1 3
3 4
4 5
输出:
8
8
8
8
8
答案:
8
8
16
14
8

根据我们的算法,删掉 \(3\) 之后,分出来两个 \(s=2\) 的连通块,但输出中间变量法发现,统计的 \(s\) 分别为 \(5,4,3,2,1\). 这说明从 \(3\) 返回 \(1\) 失败了.
根据数据思考,发现数据有可能出现 搜索到的连通块的 \(low\) 值小于搜索点的 \(dfn\) 值 的情况,譬如整颗搜索树的根节点在这个连通块上. 这样的情况我们就不会去计算它的 \(size\),那么我们需要考虑计算出这些连通块的贡献.
易得这些节点的数量等于总数量减去已搜索的节点数量,而已搜索的节点数量我们已经求出,正好是 \(1+ \sum^{i}_{1\le i\le k} s_{i}\). 它们中的每一个节点与其他连通块均不联通,即单个贡献为 \(1+\sum^{i}_{1\le i\le k} s_{i}\). 由此,有
\]
因此,本题的实质是使用Tarjan求割点并维护子树的 \(size\).
思路实现
注意到我们在上述推论中提到的子树是指 当前点的邻边拓展得到的树,因此考虑在Tarjan时直接求出上述 \(size\).
- 一个节点的 \(size\) 等于其子树之和.
- 一个节点的子节点全部遍历完成后,该节点的根节点再计入 \(size\). (这其实与Tarjan的思想相一致).
同时,仿照树形DP,为了防止DFS的时候直接走回父节点,我们给Tarjan引入一个新参数 \(root\) 表示当前节点来处的父节点 ,当遍历到 \(root\) 时直接跳过.
我们引入一个变量 \(res\) 用于累计目前搜索到的当前节点的子节点的 \(size\) 总和. \(s_{i}\) 表示当前结束递归的子节点的 \(size\),那么我们在每次遇到满足条件的点时,累计当前 \(s_{i}\times res\) 的值到 \(ans\) ,这样就可以求出全部 \(\sum^{i}_{1 \le i \le k} s_{i}\ (n-s_{i})\) 的值. 请读者稍加思考,这样可以快速求出答案,因为它保证每对点仅会乘到一次.
代码实现
点击查看
void tarjan(long long s,long long root){
dfn[s]=low[s]=++cnt;
long long son=0;
long long res=0;
for(int i:e[s]){
if(i==root){
continue; //防止走回去
}
if(!dfn[i]){
tarjan(i,s);
size[s]+=size[i];
low[s]=min(low[s],low[i]);
if(dfn[s]<=low[i]){
son++;
if(root!=0||son>1){
cutpoint[s]=true;
ans[s]+=(long long)size[i]*res; //积累s[i]*res
res+=size[i];
}
}
}
else{
low[s]=min(low[s],dfn[i]);
}
}
ans[s]+=(long long)((n-res-1)*res); //积累特判
size[s]++;
}
int main(){
long long m;
cin>>n>>m;
for(long long i=1;i<=m;++i){
long long x,y;
cin>>x>>y;
e[x].push_back(y);
e[y].push_back(x);
}
for(long long i=1;i<=n;++i){
if(!dfn[i]){
tarjan(i,0);
}
}
for(long long i=1;i<=n;++i){
cout<<2*(ans[i]+n-1)<<endl; //加上刚才没加的
}
}
[TK] BLO的更多相关文章
- import matplolib 时出现"This probably means that tk wasn't installed properly."的解决方法
最近又添了一台新电脑,配置好各个依赖环境后想用matplotlib画个图,结果报出下面的错误 根据报错分析,应该是C:/Python27/tcl/tk8.5/tk.tcl这个文件出问题了,根据图中的信 ...
- 【BZOJ-1123】BLO Tarjan 点双连通分量
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 970 Solved: 408[Submit][Status][ ...
- tk画图
Page 387 of chapter 7 """ 6-23 page 343 play media files """ def odd() ...
- Tcl Tk Introduction
Tcl Tk Introduction eryar@163.com 摘要Abstract:Tcl/Tck脚本可以很容易实现用户自定义的命令,方便的创建图形化的用户界面GUI,所以Tcl和Tk的应用领域 ...
- BZOJ 1123: [POI2008]BLO
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1030 Solved: 440[Submit][Status] ...
- 简单说说Tk和Tcl
开园第一个博客,简单说说Tk和Tcl. 我接触Tk和Tcl是在学习Python Tkinter时候,创建Tk对象,下面言归正传: Tcl:工具命令语言,英文全称为Tool Command Langua ...
- Google翻译请求(难点是tk参数)
业务需求需要将一些文字翻译一下··· 但是直接调用接口收费啊啊啊啊(貌似是前几百万字免费,然后就开始收费了)···· 就想研究一下Google翻译接口... 想模拟Google向服务器发送一个Http ...
- 匈牙利算法 cojs.tk 搭配飞行员
cojs.tk 搭配飞行员 ★★☆ 输入文件:flyer.in 输出文件:flyer.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 飞行大队有若干个 ...
- python INFO: Can't locate Tcl/Tk libs and/or headers
安装opencv的时候遇到这个错误: python INFO: Can't locate Tcl/Tk libs and/or headers 参考如下文章解决这个问题: http://www.ver ...
- Python 中的 TK编程
可爱的 Python:Python 中的 TK编程 http://www.ibm.com/developerworks/cn/linux/sdk/python/charm-12/ python che ...
随机推荐
- 双指针 & 双向搜索
双指针 根据人类直觉这个东西需要满足单调性,所以预处理的时候大概率需要排序. 好像常与二分结合使用? 可以用在序列.链表(存储位置)或者树.图上(存储结点). 或者用于其他算法(eg:单调队列.差分) ...
- Java JVM——13. 垃圾回收相关算法
1.生存还是死亡? 在堆里存放着几乎所有的 Java 对象实例,在 GC 执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象.只有被标记为己经死亡的对象,GC 才会在执行垃圾回 ...
- Python 基于pymongo操作Mongodb学习总结
实践环境 Python 3.6.4 pymongo 4.1.1 pymongo-3.12.3-cp36-cp36m-win_amd64.whl 下载地址:https://pypi.org/simple ...
- 安卓网络通信之 HttpURLConnection 文件上传
文件上传分为二步,第一步选择文件 代码思路是: chooseFile()方法用于创建一个Intent对象,并设置Intent的Action为ACTION_GET_CONTENT,这表示获取内容,即选 ...
- electron安装成功记录
1.登录官网查看当前最新版本对应的node,注意这里不要看php那个汉化的,他那个是老版本的,node对不上 2.nvm安装一个新的node 3.使用cnpm安装(npm安装还是报错了,记得删node ...
- SSL/TLS 深入浅出
SSL,https(HTTP over SSL), X.509, SSL 证书 ,证书申请 /导入/签发, 等名词,想必有一定工作经验的小伙伴,一定都会略有耳闻,或者至少也听神边大神念叨过.虽然司空见 ...
- Jmeter函数助手13-threadGroupName
threadGroupName函数获取当前线程组的名称.该函数没有参数,直接引用即可. 1. 返回当前线程组的名称
- 【Spring】06 Aop切面功能
什么是Aop? Aspect Oriented Programming 面向切面编程 通过预编译的方式和运行期动态代理实现程序功能统一维护的一种技术 是OOP的延续,也是Spring第二个核心内容 可 ...
- 【Spring】08 后续的学习补充 vol2
1.[纯注解配置实现] 首先实现纯注解配置的第一件事情就是删除XML文件 然后编写一个类用于代替XML文件实现配置功能: 使用@Configuration将这个类注册为Spring容器 使用@Comp ...
- ComfyUI插件:ComfyUI-BrushNet节点
前言: 学习ComfyUI是一场持久战,而ComfyUI-BrushNet是最近的局部重绘节点,其包含BrushNet和Powerpaint两个主要节点,其中BrushNet有SD1.5和SDXL两个 ...