题目概要:

在无向图中寻找出所有的满足下面条件的点:割掉这个点之后,能够使得一开始给定的两个点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]嗅探器的更多相关文章

  1. Luogu5058 [ZJOI2004]嗅探器

    $Luogu5058 [ZJOI2004]嗅探器 给定一张 \(n\) 个点, \(m\) 条边的无向图,和两点 \(s,\ t\) ,求 \(s\to t\) 编号最小的必经点(排除 \(s,\ t ...

  2. ⌈洛谷5058⌋⌈ZJOI2004⌋嗅探器【Tarjan】

    题目连接 [洛谷传送门] [LOJ传送门] 题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心 ...

  3. 洛谷P5058 [ZJOI2004]嗅探器

    题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息,但是蓝军的网络相当的庞大 ...

  4. P5058 [ZJOI2004]嗅探器 tarjan割点

    这个题是tarjan裸题.最后bfs暴力找联通块就行.(一开始完全写错了竟然得了70分,题意都理解反了...这数据强度...) 题干: 题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络 ...

  5. luogu P5058 [ZJOI2004]嗅探器

    题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息,但是蓝军的网络相当的庞大 ...

  6. Luogu5058 ZJOI2004嗅探器(割点)

    数据范围过小怎么做都行.考虑优秀一点的做法.考虑dfs树上两台中心服务器间的路径,路径上所有能割掉中心服务器所在子树的点均可以成为答案.直接从两点中的任意一点开始dfs就更方便了.一开始弱智的以为只要 ...

  7. [ZJOI2004]嗅探器 (割点)

    这题就比较好玩吧水题 以数据范围来看随便怎么做就能过 \(O(n)\)显然我们得过一个割点,其次这个割点得在\(x-y\)中间且不为始终点 其他都好说,在中间:从\(x\)开始遍历,首先得保证\(x- ...

  8. Tarjan总结(缩点+割点(边)+双联通+LCA+相关模板)

    Tarjan求强连通分量 先来一波定义 强连通:有向图中A点可以到达B点,B点可以到达A点,则称为强连通 强连通分量:有向图的一个子图中,任意两个点可以相互到达,则称当前子图为图的强连通分量 强连通图 ...

  9. tarjan 算法应用

    主要讲证明,流程倒是也有 然后发现自己并不会严谨证明 其实后面一些部分流程还是挺详细 本来这篇blog叫做"图论部分算法证明",然后发现OI中的图论想完全用数学上的方法证明完全超出 ...

随机推荐

  1. Android中软键盘展示、EditText焦点获取及windowSoftInputMode属性探究

    2017-08-14 21:44:23 有很多中情况,分别展示. 1.Activity不做任何设置,布局使用LinearLayout 会自动滚动EditText之上的所有View,代码: <?x ...

  2. 【webpack学习笔记】a08-缓存

    一般要优化网站的加载速度可以从缓存入手,利用缓存可以降低网络流量,减少访问请求,从而可以达到加快访问速度的目的. 但是,如果一旦将文件缓存,那么有更新的时候就不能及时更新,若要看到最新内容,那么就需要 ...

  3. Ubuntu16.04 ionic(jdk,sdk,gradle)环境搭建完全攻略

    在Ubuntu16.04当中搭建一个ionic环境还是按照官方教程的来,主要问题是首先要把JDK,SDK搭好,环境变量配好.本文中给的包的下载请不要直接用浏览器下载,很慢,尽量用wget 下载,重要的 ...

  4. js中关于声明提前的几个误区

    声明提前: 在程序正式执行之前,都会将所有的var声明的变量提前到开始位置,集中创建,而赋值留在原地. 例如这样一段代码 console.log(a) var a = 100; console.log ...

  5. sqoop碰到的问题

    sqoop碰到的问题 背景:从Oracle接入数据,一张表一千多万,数据量13G左右. 报错,表名找不到,将表名改成大写的 Exception in thread "main" j ...

  6. VMware 物理机可以复制文件到虚拟机,却无法从虚拟机复制文件到物理机(已解决)

    物理机运行,输入gpedit.msc确定,把如图的那个改成“已禁用” 之后虚拟机重新安装VMware Tool重启即可 事情是这样的,每次打开IDM会 “警告:您在以管理员身份运行IDM,在该模式下, ...

  7. [硬件黑客]钉钉智能指纹考勤机M1硬件漏洞挖掘(不定期更新)

    mailto:wangkai0351@gmail.com 钉钉智能指纹考勤机M1s,支持指纹.WIFI.蓝牙.GPS四种考勤方式,并且可实时查看考勤数据,自动生成考勤报表,告别人工核算,数据云端存储不 ...

  8. shell编程(二)

    第三十二次课 shell编程(二) 目录 十五.shell中的函数 十六.shell中的数组 十七.告警系统需求分析 十八.告警系统主脚本 十九.告警系统配置文件 二十.告警系统监控项目 二十一.告警 ...

  9. python文件(概念、基本操作、常用操作、文本文件的编码方式)

    文件 目标 文件的概念 文件的基本操作 文件/文件夹的常用操作 文本文件的编码方式 01. 文件的概念 1.1 文件的概念和作用 计算机的 文件,就是存储在某种 长期储存设备 上的一段 数据 长期存储 ...

  10. java中的异常处理问题。

    异常处理--基本概念 当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,JAVA就会用异常对象来描述. java中用2种方法处理异常: 1.在发生异常的地方直 ...