[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 ...
随机推荐
- 使用uWSGI+nginx部署Django项目(Ubuntu)
对于uwsgi+nginx的部署方式,它的访问关系大概是: 1 the web client <-> the web server <-> the socket <-&g ...
- 新做了一个MySQL 数据库 DDL 差异对比的网站
MySQL 数据库 DDL 差异对比的网站 摘要 新做了个网站,用来对比不同环境下的 DDL 差异,生成变更点和 迁移 DDL 网站地址:https://ddlcompare.com/ 对比过程中如果 ...
- LeetCode455.分发饼干
LeetCode题目链接:https://leetcode.cn/problems/assign-cookies/description/ 题目叙述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干 ...
- 《最新出炉》系列入门篇-Python+Playwright自动化测试-56- 多文件上传 - 下篇
1.简介 前边的两篇文章中,宏哥分别对input控件上传文件和非input控件上传文件进行了从理论到实践地讲解和介绍,但是后来又有人提出疑问,前边讲解和介绍的都是上传一个文件,如果上传多个文件,Pla ...
- nginx实现 springboot项目的负载均衡 策略
weight 代表权重,默认为1,权重越高被分配的客户端越多 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况. 例如 # 反向代理配置upstream server_list ...
- 【SpringBoot】02 概述
[目标] - 什么是SpringBoot? 并不是新技术,只是一个Spring的加强 解脱XML配置,增加了新的注解,但是并不是新的内容 - 新型配置文件技术 YAML - 自动装配原理[了解即可,不 ...
- 大语言模型内部运行原理 | LLM | 词向量 | Transformer | 注意力机制 | 前馈网络 | 反向传播
https://www.understandingai.org/p/large-language-models-explained-with https://arxiv.org/abs/1905.05 ...
- 华为显卡已经支持pytorch计算框架
相关链接: https://support.huawei.com/enterprise/zh/doc/EDOC1100079287/a21c08de https://www.zhihu.com/que ...
- 【转载】 SLI导致双显卡被TensorFlow同时占用问题(Windows下) ---------- (windows环境下如何为tensorflow安装多个独立的消费级显卡)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_21368481/article/d ...
- 【转载】ubuntu22.04安装gcc-8失败
版权声明:本文为CSDN博主「Death_Note_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/Death ...