[ZJOI2004]嗅探器
题目概要:
在无向图中寻找出所有的满足下面条件的点:割掉这个点之后,能够使得一开始给定的两个点a和b不连通,割掉的点不能是a或者b。(ZJOI2004)
数据范围约定
结点个数N≤100
边数M≤N*(N-1)/2
朴素算法:
枚举每个点,删除它,然后判断a和b是否连通,时间复杂度O(NM)
如果数据范围扩大,该算法就失败了!
AC算法:
题目要求的点一定是图中的割点,但是图中的割点不一定题目要求的点。如上图中的蓝色点,它虽然是图中的割点,但是割掉它之后却不能使a和b不连通
由于a点肯定不是我们所求的点,所以可以以a为根开始DFS遍历整张图。
对于生成的DFS树,如果点v是割点,如果以他为根的子树中存在点b,那么该点是问题所求的点。
时间复杂度是O(M)的
code:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=;
int read() {
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,a[N][N],deep[N],dfn[N],size[N],low[N],fa[N],timer,u,v,ans;
void tarjan(int k) {
dfn[k]=low[k]=++timer;
size[k]=;
for (int i=;i<=n;i++)
if (a[k][i]) {
if (!dfn[i]) {
tarjan(i);
fa[i]=k;
size[k]+=size[i];
low[k]=min(low[k],low[i]);
if (dfn[i]<=dfn[v]&&dfn[i]+size[i]->=dfn[v]&&low[i]>=dfn[k]&&k!=u&&k!=v) ans=min(ans,k);
}
else low[k]=min(low[k],dfn[i]);
}
}
int main() {
n=read();
u=read(),v=read();
while (u!=) {
a[u][v]=a[v][u]=;
u=read(),v=read();
}
u=read(),v=read();
ans=n+;
tarjan(u);
if (ans>n) puts("No solution");
else printf("%d\n",ans);
return ;
}
[ZJOI2004]嗅探器的更多相关文章
- Luogu5058 [ZJOI2004]嗅探器
$Luogu5058 [ZJOI2004]嗅探器 给定一张 \(n\) 个点, \(m\) 条边的无向图,和两点 \(s,\ t\) ,求 \(s\to t\) 编号最小的必经点(排除 \(s,\ t ...
- ⌈洛谷5058⌋⌈ZJOI2004⌋嗅探器【Tarjan】
题目连接 [洛谷传送门] [LOJ传送门] 题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心 ...
- 洛谷P5058 [ZJOI2004]嗅探器
题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息,但是蓝军的网络相当的庞大 ...
- P5058 [ZJOI2004]嗅探器 tarjan割点
这个题是tarjan裸题.最后bfs暴力找联通块就行.(一开始完全写错了竟然得了70分,题意都理解反了...这数据强度...) 题干: 题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络 ...
- luogu P5058 [ZJOI2004]嗅探器
题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息,但是蓝军的网络相当的庞大 ...
- Luogu5058 ZJOI2004嗅探器(割点)
数据范围过小怎么做都行.考虑优秀一点的做法.考虑dfs树上两台中心服务器间的路径,路径上所有能割掉中心服务器所在子树的点均可以成为答案.直接从两点中的任意一点开始dfs就更方便了.一开始弱智的以为只要 ...
- [ZJOI2004]嗅探器 (割点)
这题就比较好玩吧水题 以数据范围来看随便怎么做就能过 \(O(n)\)显然我们得过一个割点,其次这个割点得在\(x-y\)中间且不为始终点 其他都好说,在中间:从\(x\)开始遍历,首先得保证\(x- ...
- Tarjan总结(缩点+割点(边)+双联通+LCA+相关模板)
Tarjan求强连通分量 先来一波定义 强连通:有向图中A点可以到达B点,B点可以到达A点,则称为强连通 强连通分量:有向图的一个子图中,任意两个点可以相互到达,则称当前子图为图的强连通分量 强连通图 ...
- tarjan 算法应用
主要讲证明,流程倒是也有 然后发现自己并不会严谨证明 其实后面一些部分流程还是挺详细 本来这篇blog叫做"图论部分算法证明",然后发现OI中的图论想完全用数学上的方法证明完全超出 ...
随机推荐
- 使用Maps与Sets处理集合的交差运算
import com.google.common.collect.MapDifference; import com.google.common.collect.Maps; import java.u ...
- DOM艺术基础练习
每个月对于学习的JAVASCRIPT进行总结,加油 主要应用知识点 :
- SpingMVC的工作流程
一.SpringMVC的主要组件 前端控制器(DisatcherServlet):接收请求,响应结果,返回可以是json,String等数据类型,也可以是页面(Model). 处理器映射器(Handl ...
- Linux系统的磁盘管理
Linux系统的磁盘管理有三个命令:df.du.fdisk. df:列出Linux中所有文件系统的整体磁盘使用量: du:对文件和目录所占用磁盘空间的查看: fdisk:用于磁盘分区时列出所有的磁盘. ...
- 第4次作业 -- 基于Jenkins的持续集成
Jenkins 配置使用心得 先在 https://jenkins.io/download/ 下载Jenkins 下载之后安装,在指定的地方找到了初始密码,安装了一些插件之后,Jenkins就可以使用 ...
- select下拉列表js操作兼容性问题分享
做一个下拉列表鼠标移入改变对应的图片的值, $("select").mosover(function(){ //var i=$(this).find("selected& ...
- Alpha阶段敏捷冲刺总结
项目感言 张艺琳 在这次冲刺中,我主要担任着PM的角色.不仅要梳理流程给小组每个成员进行分工,并且还要及时监督他们在要求时间内提交代码.同时我也参与到开发中去,与小组成员一起讨论数据库,最后一起设计出 ...
- Dangerous well
Firsttime to develop games throuth Unity3d, such a great platform! You can build your games more qui ...
- 巧用std::shared_ptr全局对象释放单例内存
巧用std::shared_ptr 单例的使用相对比较广泛,但是需要在程序退出前调用它的析构函数对数据进行释放,常规做法是在main函数末尾进行释放工作, 但是这样相对比较繁琐,因此便有了利用全局变量 ...
- JAVA EE------XML
1.XML定义:在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等.它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语 ...