BZOJ BLO 1123 (割点)【双连通】
<题目链接>
以下内容转自李煜东的《算法竞赛进阶指南》
题目大意:
现在给定一张连通的无向图,不包含重边。现在输出$n$个整数,表示将第$i$个节点的所有与其它节点相关联的边去掉之后(不去掉$i$节点本身),无向图中有多少个有序对$(u,v)$,满足$u,v$不连通。
解题分析:
首先,很明显,$i$节点是需要分成割点和非割点来进行讨论的。
对于非割点i来说,去除$i$周围的所有边之后,只有$i$点和其它$n-1$个点不连通,所以增加的有序对为$2*(n-1)$个。
对于割点$i$来说,假设在搜索树上,节点i有$t$个子树,则至多能够够分成$t+2$个连通块,每个连通块的节点构成情况为:
1.节点$i$独自构成一个连通块
2.有$t$个连通块,分别由搜索树上$i$的$t$个子树的所有节点分别构成
3.还有除上述所有节点之外的点构成(比如在搜索树上,$i$节点父亲方向的所有节点)
割点有序对的所有情况就能够依据上面几种情况求出,这里就不再进行赘述。
割点的判定法则:
u是割点当且仅当搜索树上存在的一个子节点v,满足:$low[v]>=dfn[u]$
特别地,如果u是搜索树上的根节点,则u是割点当且仅当存在至少两个子节点满足上述条件。
#include <bits/stdc++.h>
using namespace std; typedef long long ll;
const int N = 1e5+, M = 5e5+;
struct Edge{
int to,nxt;
}edge[M<<]; int n,m,cnt,tot,head[N],dfn[N],low[N],sz[N];
bool cut[N];
ll ans[N]; void addedge(int u,int v){
edge[++cnt].to=v,edge[cnt].nxt=head[u];
head[u]=cnt;
}
void Tarjan(int u){
dfn[u]=low[u]=++tot;sz[u]=;
int flag=,sum=;
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(!dfn[v]){
Tarjan(v);
sz[u]+=sz[v];
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){ //如果满足割点的条件
flag++;
ans[u]+=(ll)(sz[v])*(n-sz[v]); //v所在的连通分量与其它所有点构成的有序对数量
sum+=sz[v];
if(u!= || flag>)cut[u]=true;
}
}else low[u]=min(low[u],dfn[v]);
}
if(cut[u])ans[u]+=(ll)(sum+)*(n-sum-)+(n-); //父亲方向的点与其它点构成的有序对 以及 i节点独自与其它节点构成的有序对
else ans[u]=*(n-);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++){
int u,v;scanf("%d%d",&u,&v);
addedge(u,v);addedge(v,u);
}
Tarjan(); //因为这是无向图,并且所有的点连通
for(int i=;i<=n;i++)
printf("%lld\n",ans[i]);
}
2019-03-01
BZOJ BLO 1123 (割点)【双连通】的更多相关文章
- 图的割点 桥 双连通(byvoid)
[点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合.一个图的点连通度的定义为,最小割点集 ...
- 图论之tarjan真乃神人也,强连通分量,割点,桥,双连通他都会
先来%一下Robert Tarjan前辈 %%%%%%%%%%%%%%%%%% 然后是热情感谢下列并不止这些大佬的博客: 图连通性(一):Tarjan算法求解有向图强连通分量 图连通性(二):Tarj ...
- Tarjan算法——强连通、双连通、割点、桥
Tarjan算法 概念区分 有向图 强连通:在有向图\(G\)中,如果两个顶点\(u, v\ (u \neq v)\)间有一条从\(u\)到\(v\)的有向路径,同时还有一条从\(v\)到\(u\)的 ...
- 图的强连通&双连通
http://www.cnblogs.com/wenruo/p/4989425.html 强连通 强连通是指一个有向图中任意两点v1.v2间存在v1到v2的路径及v2到v1的路径. dfs遍历一个图, ...
- HDU4612(Warm up)2013多校2-图的边双连通问题(Tarjan算法+树形DP)
/** 题目大意: 给你一个无向连通图,问加上一条边后得到的图的最少的割边数; 算法思想: 图的边双连通Tarjan算法+树形DP; 即通过Tarjan算法对边双连通缩图,构成一棵树,然后用树形DP求 ...
- 图论-桥/割点/双连通分量/缩点/LCA
基本概念: 1.割点:若删掉某点后,原连通图分裂为多个子图,则称该点为割点. 2.割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个 ...
- HDU4612Warm up 边双连通 Tarjan缩点
N planets are connected by M bidirectional channels that allow instant transportation. It's always p ...
- BZOJ 2080: [Poi2010]Railway 双栈排序
2080: [Poi2010]Railway Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 140 Solved: 35[Submit][Statu ...
- BZOJ 1093 [ZJOI2007] 最大半连通子图(强联通缩点+DP)
题目大意 题目是图片形式的,就简要说下题意算了 一个有向图 G=(V, E) 称为半连通的(Semi-Connected),如果满足图中任意两点 u v,存在一条从 u 到 v 的路径或者从 v 到 ...
随机推荐
- sleep()和wait()的区别及wait方法的一点注意事项
一.查看API sleep是Thread类的方法,导致此线程暂停执行指定时间,给其他线程执行机会,但是依然保持着监控状态,过了指定时间会自动恢复,调用sleep方法不会释放锁对象. 当调用sleep方 ...
- windows+mysql集群搭建-三分钟搞定集群
注:本文来源: 陈晓婵 < windows+mysql集群搭建-三分钟搞定集群 > 一:mysql集群搭建教程-基础篇 计算机一级考试系统要用集群,目标是把集群搭建起来,保证一 ...
- Linux 用户(user)和用户组(group)管理概述
一.理解Linux的单用户多任务,多用户多任务概念: Linux 是一个多用户.多任务的操作系统:我们应该了解单用户多任务和多用户多任务的概念: 1.Linux 的单用户多任务:单用户多任务:比如我们 ...
- 【python】安装hyperscan-python
环境centos6.2 1. 先安装hyperscan 主要参考http://blog.csdn.net/cheng_fangang/article/details/51143412 注意:里面2.8 ...
- php可变数量的参数
PHP 在用户自定义函数中支持可变数量的参数列表.在 PHP 5.6 及以上的版本中,由 ... 语法实现:在 PHP 5.5 及更早版本中,使用函数 func_num_args(),func_get ...
- 微信小程序 如何获取用户code
1.首先需要获取code 使用 wx.login({ success: function(res) { console.log(res);//这里的返回值里面便包含code }, fail: func ...
- Win10任务栏通知区域上已卸载程序无效图标选项如何清除?
在Win10系统中,大部分用户都已经知道在“选择在任务栏上显示哪些图标”来让一些软年图标显示,一些隐藏,不过使用Win10系统久了之后发现,在设置通知区域图标中有很多已经卸载程序的无效选项!这让设置时 ...
- 计算1至n中数字X出现的次数【math】
转自: nailperry 一.1的数目 编程之美上给出的规律: 1. 如果第i位(自右至左,从1开始标号)上的数字为0,则第i位可能出现1的次数由更高位决定(若没有高位,视高位为0),等于更高位数字 ...
- 洛谷---小L和小K的NOIP考后放松赛
链接: https://www.luogu.org/contestnew/show/11805?tdsourcetag=s_pcqq_aiomsg 题解: 没人过的题我就没看 t2: 考虑每个点是朋友 ...
- 【转】利用 selenium 的 webdrive 驱动 headless chrome
1.参考 使用 headless chrome进行测试 2.概念 Headless模式解决了什么问题: 自动化工具例如 selenium 利用有头浏览器进行测试,面临效率和稳定性的影响,所以出现了 H ...