初步分析

此题描述让我们想到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}\) 必然满足

\[\frac{1}{2} C_{i}=s_{i}\ (n-s_{i})
\]

再加上删去 \(i\) 节点导致其他点与 \(i\) 不连通,对于全部不连通的节点数量 \(C\) ,有

\[\frac{1}{2} C=(n-1)+\sum^{i}_{1 \le i \le k} s_{i}\ (n-s_{i})
\]

但是有一个问题,即通过上述代码得到的结果有部分数据偏小,说明我们还有未考虑到的部分.

来看一组样例

点击查看
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}\). 由此,有

\[\frac{1}{2} C=(n-1)+\sum^{i}_{1 \le i \le k} s_{i}\ (n-s_{i})\ + [n-(1+\sum^{i}_{1\le i\le k} s_{i}]\ (1+ \sum^{i}_{1\le i\le k} s_{i})
\]

因此,本题的实质是使用Tarjan求割点并维护子树的 \(size\).

思路实现

注意到我们在上述推论中提到的子树是指 当前点的邻边拓展得到的树,因此考虑在Tarjan时直接求出上述 \(size\).

  1. 一个节点的 \(size\) 等于其子树之和.
  2. 一个节点的子节点全部遍历完成后,该节点的根节点再计入 \(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的更多相关文章

  1. import matplolib 时出现"This probably means that tk wasn't installed properly."的解决方法

    最近又添了一台新电脑,配置好各个依赖环境后想用matplotlib画个图,结果报出下面的错误 根据报错分析,应该是C:/Python27/tcl/tk8.5/tk.tcl这个文件出问题了,根据图中的信 ...

  2. 【BZOJ-1123】BLO Tarjan 点双连通分量

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 970  Solved: 408[Submit][Status][ ...

  3. tk画图

    Page 387 of chapter 7 """ 6-23 page 343 play media files """ def odd() ...

  4. Tcl Tk Introduction

    Tcl Tk Introduction eryar@163.com 摘要Abstract:Tcl/Tck脚本可以很容易实现用户自定义的命令,方便的创建图形化的用户界面GUI,所以Tcl和Tk的应用领域 ...

  5. BZOJ 1123: [POI2008]BLO

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1030  Solved: 440[Submit][Status] ...

  6. 简单说说Tk和Tcl

    开园第一个博客,简单说说Tk和Tcl. 我接触Tk和Tcl是在学习Python Tkinter时候,创建Tk对象,下面言归正传: Tcl:工具命令语言,英文全称为Tool Command Langua ...

  7. Google翻译请求(难点是tk参数)

    业务需求需要将一些文字翻译一下··· 但是直接调用接口收费啊啊啊啊(貌似是前几百万字免费,然后就开始收费了)···· 就想研究一下Google翻译接口... 想模拟Google向服务器发送一个Http ...

  8. 匈牙利算法 cojs.tk 搭配飞行员

    cojs.tk  搭配飞行员 ★★☆   输入文件:flyer.in   输出文件:flyer.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述]     飞行大队有若干个 ...

  9. 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 ...

  10. Python 中的 TK编程

    可爱的 Python:Python 中的 TK编程 http://www.ibm.com/developerworks/cn/linux/sdk/python/charm-12/ python che ...

随机推荐

  1. Known框架实战演练——进销存基础数据

    本文介绍如何实现进销存管理系统的基础数据模块,基础数据模块包括商品信息.供应商管理和客户管理3个菜单页面.供应商和客户字段相同,因此可共用一个页面组件类. 项目代码:JxcLite 开源地址: htt ...

  2. Spring Boot快速入门(二)搭建javaWeb项目

    1.配置pom.xml 教程一创建的项目为maven项目,所以搭建一个Spring Boot的Web项目,先导入一下jar包:即在pom.xml以下依赖: 1 <dependencies> ...

  3. java面试一日一题:java内存区域

    问题:请讲下java内存区域? 分析:该问题比较容易和jvm内存模型相混淆,内存模型说的是java的内存规范,规定的是多线程下访问主内存的规则:而内存区域,说的是java运行时的内存划分,换句话说就是 ...

  4. 记录一下实习的第一次线下面试的答辩经历,关于seata|sentinel,gateway与栈

    面的一家小公司,他们准备做单体架构升级到微服务,所以问了我一些微服务相关的东西.回答的依托答辩,今天回想起来记录一下我造出来的笑话,正常的就不写在这里了. 首先我简历上大部分写的是熟悉,只有微服务写的 ...

  5. Redis的事务transactions与管道pipeline

    1.Redis的事务仅仅是保证事务里的操作会被连续独占的执行,Redis的命令执行是单线程, 2.Redis不保证事务的所有指令可以同时成功或者同时失败,只可以决定是否开始执行全部指令的能力,因此也没 ...

  6. 硬件开发笔记(二十九):TPS54331电源设计(二):12V转3.3V和12V转4V原理图设计

    前言   电源供电电路设计很重要,为了更好的给对硬件设计有需求的人,特意将电源设计的基础过程描述出来.  紧接前一篇12V转5V的,本篇设计常用的12V转3.3V电路,不常用的12V转4V电路.   ...

  7. 【MySQL】01 概念与介绍

    视频节选自 :P1 - P7 https://www.bilibili.com/video/BV1xW411u7ax  用户浏览的页面 - 服务器 - 数据库 所有访问的本质的东西,就是访问数据,数据 ...

  8. TinyVue v3.17.0 正式发布,推出了一款基于 Quill 2.0 的富文本编辑器,功能强大、开箱即用!

    你好,我是 Kagol. 我们非常高兴地宣布,2024年6月26日,TinyVue 发布了 v3.17.0 . TinyVue 每次大版本发布,都会给大家带来一些实用的新特性,上一个版本我们重构了 c ...

  9. mybatis-plus系统化学习之更新-AR-主键-service

    1.背景 本节要么很简单,要么不重要,知道就可以了. 2.更新 package com.ldp.demo01; import com.baomidou.mybatisplus.core.conditi ...

  10. CH08_结构体

    CH08_结构体 基本概念 结构体属于用户自定义数据类型,允许用户存储不同的数据类型. 定义和使用 语法:struct 结构体名{ 结构体成员列表} 通过结构体创建变量的方式有三种: struct 结 ...