[POI2008]BLO-Blockade 割点
[POI2008]BLO-Blockade 割点
容易想到用\(\text{Tarjan}\)求割点。对于非割点,会损失\(2\times(n-1)\)次访问(注意是互相访问,所以要乘2);对于割点,损失的访问次数即为\(\sum^{k}_{i=1}sz[i]\times(n-sz[i])\)(割点被删后,产生\(k\)个联通块,第\(i\)个联通块大小为\(sz[i]\))。在求割点时顺便安装上述分类讨论即可。
注意:求完\(u\)的子树中所有割点后,还要加上剩下来的大联通块\((n-sum-1)\times(sum+1)\)和自己\(1\times(n-1)\)次访问。
#include <cstdio>
#define MAXN 100010
#define MAXM 500010*2
#define MIN(A,B) ((A)<(B)?(A):(B))
#define MAX(A,B) ((A)>(B)?(A):(B))
#define ll long long
using namespace std;
int head[MAXN],vv[MAXM],nxt[MAXM],tot;
int read(){
int w=1,q=0;char ch=' ';
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')q=q*10+ch-'0',ch=getchar();
return w*q;
}
void add_edge(int u, int v){
vv[++tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
int n,m;
ll ans[MAXN];
int dfn[MAXN],cnt,low[MAXN],sz[MAXN];
void tarjan(int u){
dfn[u]=++cnt;
low[u]=dfn[u];
sz[u]=1;
int son_sz=0,sum=0;
bool cut=0;
for(int i=head[u];i;i=nxt[i]){
int v=vv[i];
++son_sz;
if(dfn[v]==0){
tarjan(v);
low[u]=MIN(low[u], low[v]);
sz[u]+=sz[v];
if(low[v]>=dfn[u]){
sum+=sz[v];
ans[u]+=(ll)sz[v]*(n-sz[v]);
if(u!=1) cut=1;
}
}else low[u]=MIN(low[u], dfn[v]);
}
if(u==1&&son_sz>1) cut=1;
if(!cut) ans[u]=(n-1)*2;
else ans[u]+=(ll)(n-sum-1)*(sum+1)+n-1;
}
int main() {
n=read(),m=read();
while(m--){
int a=read(),b=read();
add_edge(a,b);
add_edge(b,a);
}
tarjan(1);
for(int i=1;i<=n;++i) printf("%lld\n", ans[i]);
return 0;
}
[POI2008]BLO-Blockade 割点的更多相关文章
- bzoj1123 [POI2008]BLO——求割点子树相乘
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1123 思路倒是有的,不就是个乘法原理吗,可是不会写...代码能力... 写了一堆麻麻烦烦乱七 ...
- BZOJ 1123: [POI2008]BLO 求割点_乘法原理_计数
Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n&l ...
- bzoj 1123 [POI2008]BLO Tarjan求割点
[POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1540 Solved: 711[Submit][Status][Discu ...
- BZOJ 1123: [POI2008]BLO
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1030 Solved: 440[Submit][Status] ...
- BZOJ1123: [POI2008]BLO
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 614 Solved: 235[Submit][Status] ...
- BZOJ 1123: [POI2008]BLO( tarjan )
tarjan找割点..不是割点答案就是(N-1)*2, 是割点的话就在tarjan的时候顺便统计一下 ------------------------------------------------- ...
- [POI2008]BLO(Tarjan)
[POI2008]BLO Description Byteotia城市有\(n\)个 towns \(m\)条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所 ...
- 割点判断+luogu 3469 POI2008 BLO
1.根节点,有2棵及以上子树 2.非根节点,有子节点dfn[u]<=low[v] #include <bits/stdc++.h> #define N 1000050 using n ...
- 【bzoj1123】【[POI2008]BLO】tarjan判割点
(上不了p站我要死了,侵权度娘背锅) Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有t ...
- BZOJ1123 [POI2008]BLO(割点判断 + 点双联通缩点size)
#include <iostream> #include <cstring> #include <cstdio> using namespace std; type ...
随机推荐
- base全家桶的安装使用方法
base编码是Binary-to-text encoding的一种实现方法,它可以把二进制数据(含不可打印的字符)编码成可打印字符序列. 本文会不定时收录“base全家桶”:base64.base32 ...
- MySQL 子查询(二)
接上篇文章,从这节起:MySQL 5.7 13.2.10.5 Row Subqueries 五.行子查询(ROW Subqueries) 标量子查询返回单个值,列子查询返回一个列的多个值.而行子查询是 ...
- PHP传引用赋值底层的变化
$a = 3;$b = &$a;//传引用,即地址赋值 使用xdebug_debug_zval('a');使用xdebug_debug_zval('b');运行结果为:a:(refcount= ...
- PHP运行机制和原理
以echo "Hello World";为例 经历五个步骤:1.扫描(scanning):先进行语法分析和词法分析,然后将index.php内容变成一个个语言片段(token ar ...
- 第八讲,TLS表(线程局部存储)
一丶复习线程相关知识 首先讲解TLS的时候,需要复习线程相关知识, (thread local storage ) 1.了解经典同步问题 首先我们先写一段C++代码,开辟两个线程去跑,看看会不会出现 ...
- (六)springmvc之ModelAndView、Model、Map、ModelMap
<a href="<%=request.getContextPath()%>/responseData/response_1">使用原生的作用域</a ...
- 验证 vector = 是深拷贝还是浅拷贝
#include <vector> using namespace std; int main() { int w=1920; int h = 1080; vector<int> ...
- JavaScript_day01
1.变量声明 怎么声明变量? JavaScript中变量声明用的关键字是 var 变量名称. 变量名称命名有什么限制? 变量名称命名需规范,准则:不能以数字开头,不能含有特殊字符(css的属性),可以 ...
- Ubuntu安装telnet
安装 # sudo apt-get install xinetd telnetd 配置 -> 加入以下选项 # sudo vi /etc/inetd.conf telnet stream tcp ...
- kbmMW 5.10.01试用报告
1.FileClient.SameFile 调用这个方法,当本地文件不存在时,会一直等待.跟踪代码,发现: function TkbmMWCustomFileClient.SameFileEx(Loc ...