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 到 ...
随机推荐
- 我不是机器人:谷歌最新版验证码系统ReCaptcha破解已开源
选自 Github 作者:George Hughey 机器之心编译 每个人都讨厌验证码,这些恼人的图片中包含你必须输入的字符,我们只有正确地填写才能继续访问网站.验证码旨在确认访问者是人还是程序,并防 ...
- Oracle12c安装和卸载图文教程
注:本文来源于:<Oracle12c安装和卸载图文教程> 一.安装 1.去官网下载相应的版本 2.下载好的两个压缩文件压缩到一个文件夹中 3.打开上个步骤的文件夹,运行stepup,显示如 ...
- CF919F
题意: Alice和Bob玩游戏,每人各有8张牌,牌的大小在0~4之间 每次操作,先手可以选择自己一张牌和对方一张牌求和后%5,将新的牌替代自己拿出的那张牌,以此类推,直到有一个人手中的牌全部是0,则 ...
- binlog2sql之MySQL数据闪回实践
DBA或开发人员,有时会误删或者误更新数据,如果是线上环境并且影响较大,就需要能快速回滚.传统恢复方法是利用备份重搭实例,再应用去除错误sql后的binlog来恢复数据.此法费时费力,甚至需要停机维护 ...
- C++ Primer 笔记——固有的不可移植的特性
1.为了支持底层编程,C++定义了一些固有的不可移植的特性,所谓不可移植特性是指因机器而异的特性. 2.一个位域中含有一定数量的二进制位,位域在内存中的布局是机器相关的.位域的类型必须是整型或枚举类型 ...
- python面向对象三大特性之封装
一. 概述 定义:隐藏对象的属性和实现细节,仅对外提供公共访问方式 封装的原则:把不需要对外提供的内容都隐藏起来,提供公共的方法访问这些隐藏属性 二.封装手段 使用双下划线将属性和方法隐藏起来 cla ...
- 添加依赖:https://mvnrepository.com/
该网站搜索
- 关于前端滚动条,input框等样式的修改
1.改变滚动条的样式 .orderList::-webkit-scrollbar {/*滚动条整体样式*/ width: 4px; /*高宽分别对应横竖滚动条的尺寸*/ height: 4px;}.o ...
- 金蝶k3密码批量修改
该字段含有单引号,直接使用查询语句,需要转义其中的单引号.select * from t_User where FSID = ') F ", ,P T #8 *P!D &D 80!N ...
- H5实现轮播
页面代码: <div id="body_wrapper" class="container"> <article> <sectio ...