[LUOGU] P3469 [POI2008]BLO-Blockade
https://www.luogu.org/problemnew/show/P3469
求无向图分别删去每个点后不连通的点对数。
首先,对于任何一个点,它本身删了,就会和剩下的n-1个点不连通,点对是有序的,所以初始答案为(n-1)*2
接下来考虑一些删去后能使原图分裂的点,也就是割点,它们带来的额外贡献就是 π(分裂出的几个连通块大小)*2,考虑如何求连通块数。
这里卡住了,看了sol..看来对tarjan的理解还是不够深
在原搜索树上记录子树siz[v],记sum=Σsiz[v],所以父亲那边的点就是n-sum-1个(减去自己),现在考虑这些连通块的贡献。
子树之间互相不连通,产生sum*siz[v]的贡献(sum晚一步更新,保证不重不漏),这样就可以计算子树间的贡献了。
然后计算父亲和子树们的贡献,就是siz[fa]*sum,此时sum已经更新为了整个子树的大小,siz[fa]=n-sum-1
时间复杂度O(n)
今天突然好困qwq
#include<iostream>
#include<cstdio> using namespace std; inline int rd() {
int ret=,f=;
char c;
while(c=getchar(),!isdigit(c))f=c=='-'?-:;
while(isdigit(c))ret=ret*+c-'',c=getchar();
return ret*f;
} const int MAXN=; int n,m; struct Edge {
int next,to,w;
} e[MAXN*];
int ecnt,head[MAXN];
inline void add(int x,int y) {
e[++ecnt].next = head[x];
e[ecnt].to = y;
head[x] = ecnt;
} int dfn[MAXN],low[MAXN],tim;
long long siz[MAXN],ans[MAXN];
void tarjan(int x) {
dfn[x]=low[x]=++tim;
siz[x]=;
long long sum=;
for(int i=head[x]; i; i=e[i].next) {
int v=e[i].to;
if(!dfn[v]) {
tarjan(v);siz[x]+=siz[v];
low[x]=min(low[x],low[v]);
if(dfn[x]<=low[v]) {
ans[x]+=sum*siz[v];
sum+=siz[v];
}
} else{
low[x]=min(low[x],dfn[v]);
}
}
ans[x]+=sum*(n-sum-);
} int main() {
n=rd();
m=rd();
int x,y,w;
for(int i=; i<=m; i++) {
x=rd();
y=rd();
add(x,y);
add(y,x);
}
for(int i=;i<=n;i++) if(!dfn[i]) tarjan(i);
for(int i=;i<=n;i++) ans[i]+=n-;
for(int i=;i<=n;i++) printf("%lld\n",ans[i]<<);
return ;
}
[LUOGU] P3469 [POI2008]BLO-Blockade的更多相关文章
- [Luogu P3469] [POI2008]BLO-Blockade (割点)
题面 传送门:https://www.luogu.org/problemnew/show/P3469 Solution 先跟我大声念: poi! 然后开始干正事. 首先,我们先把题目中的点分为两类:去 ...
- 【luogu P3469 [POI2008]BLO-Blockade】 题解
题目链接:https://www.luogu.org/problemnew/show/P3469 #include <cstdio> #include <cstring> #i ...
- 割点判断+luogu 3469 POI2008 BLO
1.根节点,有2棵及以上子树 2.非根节点,有子节点dfn[u]<=low[v] #include <bits/stdc++.h> #define N 1000050 using n ...
- BZOJ 1123 && Luogu P3469 [POI2008]BLO-Blockade 割点+乘法原理
想了半天式子...最后在邓大师的帮助下想出此题....QWQ我还是太菜了 对于一个非割点,ans+=2*(n-1); 对于一个割点,ans+= #include<cstdio> #incl ...
- 洛谷 P3469 [POI2008]BLO-Blockade (Tarjan,割点)
P3469 [POI2008]BLO-Blockade https://www.luogu.org/problem/P3469 题目描述 There are exactly nn towns in B ...
- 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的时候顺便统计一下 ------------------------------------------------- ...
- bzoj 1123 [POI2008]BLO Tarjan求割点
[POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1540 Solved: 711[Submit][Status][Discu ...
随机推荐
- css margin边界叠加问题详谈
问题:给子元素一个margin-top值,其父元素会跟着往下走margin-top的值 一.代码展示 HTML <body> <div class="box"&g ...
- dfs,bfs的二分匹配模板(模板题hdu1150)
如果不懂匈牙利算法,请点击:该趣味算法http://blog.csdn.net/dark_scope/article/details/8880547 模板: //DFS版本下的二分匹配算法 http: ...
- c# dynamic 无法创建 泛型变量的问题
IMyClass<T> FunctionA<T>( object arg_obj) { dynamic dyObj = arg_obj; return new MyClass& ...
- S.O.L.I.D: PHP 面向对象设计的五个基准原则
S.O.L.I.D 是首个 5 个面向对象设计 (OOD) 准则的首字母缩写,这些准则是由 Robert C. Martin 提出的,他更为人所熟知的名字是 Uncle Bob. 这些准则使得开发出易 ...
- 1051:A × B problem 大数相乘
给你两个整数,请你计算A × B. 输入 数据的第一行是整数T(1 ≤ T ≤ 20),代表测试数据的组数.接着有T组数据,每组数据只有一行,包括两个非负整数A和B.但A和B非常大,Redraimen ...
- Java 关键字volatile的解释
volatile 关键字特征: 1.可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的.可以禁止线程的工作内存对volatile修饰的变量进行缓存,并将修改的变量立即写入主存. 2. ...
- AJPFX关于Set接口学习笔记及总结
Set接口中的方法和Collection中方法一致的.Set接口取出方式只有一种,迭代器. |--HashSet:底层数据结构是哈希表,线程是不同步的.无序,高效: HashSet集合保证元素唯一性: ...
- 【转】java序列化一定要应该注意的6个事项!
1.如果子类实现Serializable接口而父类未实现时,父类不会被序列化,但此时父类必须有个无参构造方法,否则会抛InvalidClassException异常. 2.静态变量不会被序列化,那是类 ...
- #pragma使用分析
#pragma简介 #pragma用于指示编译器完成一些特定的动作 #pragma所定义的很多指示字是编译器特有的 #pragma在不同的编译器间是不可移植的 预处理器将忽略它不认识的#pragma指 ...
- 【HEVC帧间预测论文】P1.7 Content Based Hierarchical Fast Coding Unit Decision Algorithm
Content Based Hierarchical Fast Coding Unit Decision Algorithm For HEVC <HEVC标准介绍.HEVC帧间预测论文笔记> ...