[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 ...
随机推荐
- Known框架实战演练——进销存基础数据
本文介绍如何实现进销存管理系统的基础数据模块,基础数据模块包括商品信息.供应商管理和客户管理3个菜单页面.供应商和客户字段相同,因此可共用一个页面组件类. 项目代码:JxcLite 开源地址: htt ...
- Spring Boot快速入门(二)搭建javaWeb项目
1.配置pom.xml 教程一创建的项目为maven项目,所以搭建一个Spring Boot的Web项目,先导入一下jar包:即在pom.xml以下依赖: 1 <dependencies> ...
- java面试一日一题:java内存区域
问题:请讲下java内存区域? 分析:该问题比较容易和jvm内存模型相混淆,内存模型说的是java的内存规范,规定的是多线程下访问主内存的规则:而内存区域,说的是java运行时的内存划分,换句话说就是 ...
- 记录一下实习的第一次线下面试的答辩经历,关于seata|sentinel,gateway与栈
面的一家小公司,他们准备做单体架构升级到微服务,所以问了我一些微服务相关的东西.回答的依托答辩,今天回想起来记录一下我造出来的笑话,正常的就不写在这里了. 首先我简历上大部分写的是熟悉,只有微服务写的 ...
- Redis的事务transactions与管道pipeline
1.Redis的事务仅仅是保证事务里的操作会被连续独占的执行,Redis的命令执行是单线程, 2.Redis不保证事务的所有指令可以同时成功或者同时失败,只可以决定是否开始执行全部指令的能力,因此也没 ...
- 硬件开发笔记(二十九):TPS54331电源设计(二):12V转3.3V和12V转4V原理图设计
前言 电源供电电路设计很重要,为了更好的给对硬件设计有需求的人,特意将电源设计的基础过程描述出来. 紧接前一篇12V转5V的,本篇设计常用的12V转3.3V电路,不常用的12V转4V电路. ...
- 【MySQL】01 概念与介绍
视频节选自 :P1 - P7 https://www.bilibili.com/video/BV1xW411u7ax 用户浏览的页面 - 服务器 - 数据库 所有访问的本质的东西,就是访问数据,数据 ...
- TinyVue v3.17.0 正式发布,推出了一款基于 Quill 2.0 的富文本编辑器,功能强大、开箱即用!
你好,我是 Kagol. 我们非常高兴地宣布,2024年6月26日,TinyVue 发布了 v3.17.0 . TinyVue 每次大版本发布,都会给大家带来一些实用的新特性,上一个版本我们重构了 c ...
- mybatis-plus系统化学习之更新-AR-主键-service
1.背景 本节要么很简单,要么不重要,知道就可以了. 2.更新 package com.ldp.demo01; import com.baomidou.mybatisplus.core.conditi ...
- CH08_结构体
CH08_结构体 基本概念 结构体属于用户自定义数据类型,允许用户存储不同的数据类型. 定义和使用 语法:struct 结构体名{ 结构体成员列表} 通过结构体创建变量的方式有三种: struct 结 ...