[Luogu P3469] [POI2008]BLO-Blockade (割点)
题面
传送门:https://www.luogu.org/problemnew/show/P3469



Solution
先跟我大声念:
poi!
然后开始干正事。
首先,我们先把题目中的点分为两类:去除这个点能把图分为几个部分的,去除这个点不影响整个图的连通性的。
如下图:
点上的数字表示这个点的搜索序。

我们称这些对连通性有影响的点为割点。
先假设我们能求出这些点以及其出去后把图分为几块之后那几块分别的大小。
是不是发现了什么?
对于非割点,答案显然是2*(n-1) (因为它不能影响别的点对连通性,能影响的只是别人到它以及它到别人)
对于割点,它把那几块弄得无法联通,即那几块中不同块的两个点肯定就无法联通了,答案也就是每组块的点的数量互相乘出来,再加上2*(n-1)。
接下来就是如何求割点了。
这时候我们又得请出伟大的Tarjan了。
先回忆一下求强连通分块的做法,我们这里求割点的做法与其类似。
但有以下几点不同:
1.我们在求low的时候不用讨论所连向的点是否在栈中了,因为无向图中没有横插边的说法(但是要记录当前的父亲,防止我们的low直接计算回去)
2.当一个点的某一个孩子的low>=此点的dfn时,说明这个点就是割点。因为孩子的low大于当前节点的dfn,说明它没有办法直接从当前节点回到搜索树搜过的节点。如果当前节点删除了,此孩子将会分割开来)
至于怎么求每个孩子的size........
(我想这个应该不用说了吧)
就是搜的时候加上去就好,如果不清楚的话看一下代码就懂了。
时间复杂度O(n)
完全OjbK
Code
//Luogu P3469 [POI2008]BLO-Blockade
//June,11th,2018
//玄幻割点
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
long long read()
{
long long x=0,f=1; char c=getchar();
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int N=100000+100;
vector <long long> e[N],nd_size[N];
int n,m;
int dfn[N],low[N],IsGD[N],nd_to,size[N];
void Tarjan(int now,int fa)
{
dfn[now]=low[now]=++nd_to;
size[now]++;
int temp=0;
for(int i=0;i<int(e[now].size());i++)
if(dfn[e[now][i]]==0)
{
Tarjan(e[now][i],now);
size[now]+=size[e[now][i]];
low[now]=min(low[now],low[e[now][i]]);
if(low[e[now][i]]>=dfn[now])
{
temp+=size[e[now][i]];
IsGD[now]=true;
nd_size[now].push_back(size[e[now][i]]);
}
}
else if(e[now][i]!=fa)
low[now]=min(low[now],low[e[now][i]]);
if(IsGD[now]==true and n-temp-1!=0)
nd_size[now].push_back(n-temp-1);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
e[i].reserve(4);
nd_size[i].reserve(4);
}
for(int i=1;i<=m;i++)
{
int s=read(),t=read();
e[s].push_back(t);
e[t].push_back(s);
} Tarjan(1,0); for(int i=1;i<=n;i++)
{
long long ans=2*(n-1);
if(nd_size[i].size()!=0 and nd_size[i].size()!=1)
{
for(int j=0;j<int(nd_size[i].size());j++)
for(int k=j+1;k<int(nd_size[i].size());k++)
ans+=2*nd_size[i][j]*nd_size[i][k];
}
printf("%lld\n",ans);
}
return 0;
}
正解(C++)
[Luogu P3469] [POI2008]BLO-Blockade (割点)的更多相关文章
- P3469 [POI2008]BLO-Blockade(Tarjan 割点)
P3469 [POI2008]BLO-Blockade 题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每 ...
- 割点判断+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 ...
- [LUOGU] P3469 [POI2008]BLO-Blockade
https://www.luogu.org/problemnew/show/P3469 求无向图分别删去每个点后不连通的点对数. 首先,对于任何一个点,它本身删了,就会和剩下的n-1个点不连通,点对是 ...
- 【luogu P3469 [POI2008]BLO-Blockade】 题解
题目链接:https://www.luogu.org/problemnew/show/P3469 #include <cstdio> #include <cstring> #i ...
- 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 ...
- 洛谷 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 Tarjan求割点
[POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1540 Solved: 711[Submit][Status][Discu ...
随机推荐
- oracle中插入一条记录后,重新登录查找不到数据
你插入了数据,但是没有提交.其他Session也就是你再次登录后自然就看不到了(但是在当前回话可以看到插入的数据),但是你用SQLPLUS EXIT之后再次登录就可以看到插入的数据了,因为ORACLE ...
- Centos-分割文件-split
split 分割文件,将一个文件分割为多个 相关选项 -b 指定文件大小,可以在size后面添加单位后缀,b表示512字节,k表示1KB,m表示MB -n 指定分割文件的长度,默认为1000行 -d ...
- Machine Learning-特征工程之特征选择
特征工程之特征选择 目录 简介 1 Filter(过滤式选择) 1.1 移除低方差特征(variance threshold) 1.2 信息增益(information gain) 1.3 单变量特征 ...
- Mindmaster破解版与正版
1 免费版与正版 MindMaster思维导图软件,免费版没有过期时间可以一直使用,导出或者保存的文件没有水印.免费版和专业版的不同之处在于,专业版可以享受全功能,比如导出为可编辑的PDF.Offic ...
- Serial.begin
串口波特率的设置:通常我们使用Serial.begin(speed)来完成串口的初始化,这种方式,只能配置串口的波特率. 使用Serial.begin(speed, config)可以配置数据位.校验 ...
- 连接mysql客户端报错: java.sql.SQLException: Unable to load authentication plugin 'caching_sha2_password'
报这个错可能是因为用了低版本的的客户端.驱动连接高版本的mysql服务器. 解决方式有三种:升级客户端版本.修改服务端认证方式和适应服务端认证方式. 我是通过升级客户端版本解决,参考一下链接: Upg ...
- java swing 按钮事件触发两次或者多次
按钮事件触发多次? 如果是JButton,八成是由于粗心,多次添加了监听事件 保持只添加一个监听事件就解决了~
- gitlab-配置邮件
一:配置邮件 1. 进入配置文件,通过修改/etc/gitlab/gitlab.rb来设置邮件功能 修改后的文件 1 ## GitLab URL 2 ##! URL on which GitLab ...
- ThreadLocal什么时候会出现OOM的情况?为什么?
ThreadLocal里面使用了一个存在弱引用的map,当释放掉threadlocal的强引用以后,map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露. 最好 ...
- mysql5.5和5.6的一些区别
timestamp 5.5中 直接写timestamp不加长度 5.6 中 写的timestamp(3) datatime 5.5中 直接写datetime 不加长度 5.6中 可以添加长度(3 ...