bzoj1123 割点性质应用
删掉无向图上任意一点,请求出将会增加的不连通的点对数
将无向图联通性的问题转化到搜索树方向上考虑
如果一个点不是割点,那么删掉该点的答案很简单,就是2*(n-1)
如果点u是割点,同时u在搜索树上有t个子节点,那么删掉u点后就会出现t+2个联通分量
1.t个包含不同子节点的联通分量:每个子节点联通分量的贡献是size[son]*(n-size[son])
2.结点u:u的贡献是(n-1)
3.剩下部分,即u子树除外其他的点形成的联通分量:这部分的贡献是n-1-sum{size[son]}
在tarjan时同时求出size数组即可
#include<bits/stdc++.h>
using namespace std;
#define maxn 500005
struct Edge{int to,nxt;}edge[maxn<<];
int head[maxn],tot,n,m;
long long ans[maxn]; void init(){
tot=;
memset(head,-,sizeof head);
}
void addedge(int u,int v){
edge[tot].to=v;
edge[tot].nxt=head[u];
head[u]=tot++;
} int cut[maxn],low[maxn],dfn[maxn],size[maxn],ind;
void tarjan(int u){
dfn[u]=low[u]=++ind;
size[u]=;
int flag=,sum=;
for(int i=head[u];i!=-;i=edge[i].nxt){
int v=edge[i].to;
if(!dfn[v]){
tarjan(v);
low[u]=min(low[u],low[v]);
size[u]+=size[v];
if(low[v]>=dfn[u]){
flag++;
ans[u]+=(long long)size[v]*(n-size[v]);
sum+=size[v];
if(u!= || flag>)
cut[u]=true;//u是割点
}
}
else low[u]=min(low[u],dfn[v]);//回边
}
if(cut[u])
ans[u]+=(long long)(n-sum-)*(sum+)+(n-);//加上剩余部分
else
ans[u]=*(n-);
} int main(){
init();
cin>>n>>m;
for(int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
if(u==v)continue;//规定无重边
addedge(u,v);
addedge(v,u);
}
tarjan();
for(int i=;i<=n;i++)
printf("%lld\n",ans[i]); }
bzoj1123 割点性质应用的更多相关文章
- 洛谷 P3388 割点(割顶) 题解
题面: 割点性质: 节点 u 如果是割点,当且仅当存在 u 的一个子树,子树中没有连向 u 的祖先的边(返祖边). 换句话说,如果对于一个点u,它的子节点是v,如果low[v] ...
- 【bzoj1123】【[POI2008]BLO】tarjan判割点
(上不了p站我要死了,侵权度娘背锅) Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有t ...
- bzoj1123 [POI2008]BLO——求割点子树相乘
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1123 思路倒是有的,不就是个乘法原理吗,可是不会写...代码能力... 写了一堆麻麻烦烦乱七 ...
- BZOJ1123 [POI2008]BLO(割点判断 + 点双联通缩点size)
#include <iostream> #include <cstring> #include <cstdio> using namespace std; type ...
- tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)
基本概念 给定无向连通图G = (V, E)割点:对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点割边(桥)若对于e∈E,从图中删去边e之后,G分 ...
- {part1}DFN+LOW(tarjan)割点
什么是jarjan? 1)求割点 定义:在无向连通图中,如果去掉一个点/边,剩下的点之间不连通,那么这个点/边就被称为割点/边(或割顶/桥). 意义:由于割点和割边涉及到图的连通性,所以快速地求出割点 ...
- Tarjan求强连通分量,缩点,割点
Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...
- Tarjan算法打包总结(求强连通分量、割点和Tarjan-LCA)
目录 Tarjan打包总结(求强连通分量.割点和Tarjan-LCA) 强连通分量&缩点 原理 伪代码 板子(C++) 割点 原理 伪代码 最近公共祖先(LCA) 原理 伪代码 板子 Tarj ...
- Tarjan的缩点&&割点概述
What is Tarjan? Tarjan,是一种用来解决图的联通性的一种有效途径,它的一般俗称叫做:缩点.我们首先来设想一下: 如果我们有一个图,其中A,B,C构成一个环,那么我们在某种条件下,如 ...
随机推荐
- axios 在Vue全局引入的方法
在main.js中: import axios form axios Vue.prototype.$axios = axios 组件中使用: submitFrom () { this.$axios.g ...
- Java_常遇问题(一)
Java_常遇问题 1.100/3 保留两位小数,处理方式: 业务场景一般在金额上 int a = 100, b =3; double result = Double.valueOf(new Deci ...
- python基础知识~备份还原功能设计
一 相关模块设计 1 配置文件管理模块 configparser 1 config-value不要加引号 2 linux系统执行命令模块 subprocess 1 shell=True代表命 ...
- (3)java数据结构--有枚举 属性
java中的数据结构 - 南风顾 - 博客园http://www.cnblogs.com/tingxuelou/p/6686143.html 线性表,链表,哈希表是常用的数据结构,在进行Java开发时 ...
- T5557 读写卡详解
T5557的基本信息就不在这里详细介绍,不了解的可以去看T5557的收据手册. 一上来直接开始讲操作 存在七种操作,我们重点介绍四种,Standard Write,Protected Write,Di ...
- 使用CORS方式跨域
什么是CORS CORS(Cross-Origin Resource Sharing 跨源资源共享),当一个请求url的协议.域名.端口三者之间任意一与当前页面地址不同即为跨域. ===前端 不需要携 ...
- 关于Oracle数据库故障诊断基础架构
本节包含有关Oracle数据库故障诊断基础结构的背景信息.它包含以下主题: 故障诊断基础架构概述 关于事件和问题 故障诊断基础设施组件 自动诊断信息库的结构,内容和位置 故障诊断基础架构概述 故障诊断 ...
- Linux就该这么学(1)-系统概述(学习笔记)
一.热门的Linux系统开源许可协议 GNU GPL(GNU General Public License,GNU 通用公共许可证) BSD(Berkeley Software Distributio ...
- Vivado Turtorial 01 —— 使用vivado中debug功能(类似ISE中ChipScope)
1.基于BASYS3板子,有如下代码: module top( input clk, input rst, output test_clk ); parameter DIV_CNT = 2; reg ...
- 利用C#进行AUTOCAD的二次开发
众所周知,对AutoCAD进行二次开发用到的主要工具有:ObjectArx,VBA,VLisp.但它们的优缺点是显而易见的:ObjectArx功能强大,编程效率高,但它的缺点是编程者必须掌握VC++, ...