$Luogu5058 [ZJOI2004]嗅探器

给定一张 \(n\) 个点, \(m\) 条边的无向图,和两点 \(s,\ t\) ,求 \(s\to t\) 编号最小的必经点(排除 \(s,\ t\) )

\(n\leq100\)

tarjan


这题数据范围是可以 \(O(n^3)\) 暴力过的……

显然只需缩点后的树上 \(bl_s\) 到 \(bl_t\) 上找答案,统计割点贡献即可

然而此题有更简单的做法……

从 \(s\) 开始 tarjan,点 \(u\) 对答案有贡献当且仅当满足以下四个条件:

  1. \(u\neq s,\ t\)
  2. \(cut_u=\operatorname{true}\)
  3. \(dfn_v\leq dfn_t\) ,因为终点必须在 \(u\) 之后访问到
  4. \(dfn_u\leq low_t\) ,因为路径必须要经过 \(u\) 点

然后上板子

时间复杂度 \(O(n+m)\)

这份代码是缩点后统计链的……

#include <bits/stdc++.h>
using namespace std; const int maxn = 110, inf = INT_MAX;
bool cut[maxn];
int n, m, A, B, h[maxn], q[maxn << 1], pre[maxn << 1];
int top, dcc, tot, st[maxn], bl[maxn], dfn[maxn], low[maxn]; struct edges {
int nxt, to;
edges(int x = 0, int y = 0) :
nxt(x), to(y) {}
} e[maxn * maxn * 2]; vector <int> E[maxn << 1], d[maxn]; void addline(int u, int v) {
static int cnt;
e[++cnt] = edges(h[u], v), h[u] = cnt;
} void tarjan(int u, int f) {
static int now;
st[++top] = u;
dfn[u] = low[u] = ++now;
if (!f && !h[u]) {
d[++dcc].push_back(u);
return;
}
for (int i = h[u], chd = 0; i; i = e[i].nxt) {
int v = e[i].to;
if (!dfn[v]) {
tarjan(v, 1);
low[u] = min(low[u], low[v]);
if (dfn[u] <= low[v]) {
cut[u] |= f || chd++;
for (dcc++; st[top + 1] != v; top--) {
d[dcc].push_back(st[top]);
}
d[dcc].push_back(u);
}
} else {
low[u] = min(low[u], dfn[v]);
}
}
} int bfs(int S, int T) {
if (S == T) return inf;
int l = 1, r = 1;
q[1] = S, pre[S] = -1;
while (l <= r) {
int u = q[l++];
for (int v : E[u]) {
if (!pre[v]) {
q[++r] = v, pre[v] = u;
}
}
}
int res = inf;
for (int u = pre[T]; u != S; u = pre[u]) {
if (u > dcc) res = min(res, u);
}
return res;
} int main() {
scanf("%d", &n);
int u, v;
while (scanf("%d %d", &u, &v) && u && v) {
addline(u, v), addline(v, u);
}
scanf("%d %d", &A, &B);
for (int i = 1; i <= n; i++) {
if (!dfn[i]) tarjan(i, 0);
}
tot = dcc;
for (int i = 1; i <= n; i++) {
if (cut[i]) bl[i] = ++tot;
}
for (int i = 1; i <= dcc; i++) {
for (int j = 0, _sz = int(d[i].size()); j < _sz; j++) {
int x = d[i][j];
if (cut[x]) {
E[i].push_back(bl[x]);
E[bl[x]].push_back(i);
} else {
bl[x] = i;
}
}
}
int res = bfs(bl[A], bl[B]);
if (res > 1e9) {
puts("No solution");
} else {
for (int i = 1; i <= n; i++) {
if (cut[i] && bl[i] == res) {
printf("%d", i); break;
}
}
}
return 0;
}

Luogu5058 [ZJOI2004]嗅探器的更多相关文章

  1. Luogu5058 ZJOI2004嗅探器(割点)

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

  2. [ZJOI2004]嗅探器

    题目概要: 在无向图中寻找出所有的满足下面条件的点:割掉这个点之后,能够使得一开始给定的两个点a和b不连通,割掉的点不能是a或者b.(ZJOI2004) 数据范围约定结点个数N≤100边数M≤N*(N ...

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

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

  4. 洛谷P5058 [ZJOI2004]嗅探器

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

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

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

  6. luogu P5058 [ZJOI2004]嗅探器

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

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

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

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

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

  9. tarjan 算法应用

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

随机推荐

  1. SpringMvc通过@Value( ) 给静态变量注入值

    spring 不允许/不支持把值注入到静态变量中,如: @Value("${ES.CLUSTER_NAME}")private static String CLUSTER_NAME ...

  2. C++STL模板库关联容器之set/multiset

    目录 一丶关联容器简介.set/multiset 二丶演示代码. 一丶关联容器简介.set/multiset 我们的序列容器,底层都是线性表构成的. 比如 vector list deque. 关联容 ...

  3. Linux svn checkout时候总报设备上没有空间

    详细报错信息:svn: 不能打开文件“weibosearch2.0.0/.svn/lock”: 设备上没有空间 但是df -h查看磁盘[root@picdata-1-2 data]# df -h文件系 ...

  4. js转base64(数字)

    var name='测试文字'; var t_name=encodeURIComponent(name); t_name=window.btoa(t_name); console.log(t_name ...

  5. Django 系列博客(十四)

    Django 系列博客(十四) 前言 本篇博客介绍在 html 中使用 ajax 与后台进行数据交互. 什么是 ajax ajax(Asynchronous Javascript And XML)翻译 ...

  6. weblogic 安装配置打补丁

    Master Note on WebLogic Server (WLS) Patches, Upgrade Installers, and Full Installers

  7. iOS----------The Apple Developer Program License Agreement has been updated.

    The Apple Developer Program License Agreement has been updated. In order to access certain membershi ...

  8. java.lang.NoSuchFieldError异常

    原因就是主项目的xml文件和库项目中的xml文件 命名一样,导致库项目中的xml文件被主项目覆盖,所以库项目就找不到xml中的相关id,就报异常了.   解决方法:修改主项目中的xml文件命名,不要和 ...

  9. 更新下载库update绝对详解

    下载更新apk,基本上每个app都需要的功能,来看看吧,肯定有你想要的,以前都是自己写,近期想借助第三方的一个库来做,功能齐全,感觉不错,记录使用过程,虽然官方也有使用教程,不过毕竟粗略,网上也能搜到 ...

  10. 操作系统:修改VirtualBox for Mac的虚拟硬盘大小

    我安装的是Mac版的VirtualBox,不能从GUI上修改硬盘大小,但是实在是大小不够用了. 百度后得知,可以用命令行修改. 1.打开终端,输入sudo su,取得管理员权限 $ sudo su P ...