题解 P5058 【[ZJOI2004]嗅探器】

Solution [ZJOI2004]嗅探器

题目大意:给定一个无向图,求一个编号最小的点\(p\),使得删掉\(p\)后\(s\)和\(t\)不连通

分析:首先我们要明确:点\(p\)一定是割点,因为只有你删掉一个点后图不连通才有可能使得\(s\)和\(t\)不连通,然后我们可以用\(tarjan\)来做这个事情

常规求割点是什么,时间戳\(dfn\),不经过树边可以到达的最小时间戳\(low\)

如果存在\(u\)以及它的子节点\(v\),如果有\(dfn[u] \leq low[v]\)那么\(u\)就是割点,因为去掉\(u\)后以\(v\)为根的子树就和图不连通了

所以我们以\(s\)为根做\(tarjan\),只要在\(u\)是割点时判断一下\(t\)在不在以\(v\)为根的子树内就好了,这个显然是\(dfn[v] \leq dfn[t]\)

#include <cstdio>
#include <cctype>
#include <vector>
using namespace std;
const int maxn = 128;
inline int read(){
    int x = 0;char c = getchar();
    while(!isdigit(c))c = getchar();
    while(isdigit(c))x = x * 10 + c - '0',c = getchar();
    return x;
}
vector<int> G[maxn];
inline void addedge(int from,int to){G[from].push_back(to);}
int dfn[maxn],low[maxn],tot,s,t,n,ans = 0x7fffffff;
void tarjan(int u,int faz){
    dfn[u] = low[u] = ++tot;
    for(int v : G[u]){
        if(!dfn[v]){
            tarjan(v,u);
            low[u] = min(low[u],low[v]);
            if(dfn[v] <= dfn[t] && dfn[u] <= low[v] && u != s)ans = min(ans,u);
        }else if(v != faz && dfn[v])low[u] = min(low[u],dfn[v]);
    }
}
int main(){
    n = read();
    for(int u = read(),v = read();u && v;u = read(),v = read())
        addedge(u,v),addedge(v,u);
    s = read(),t = read();
    tarjan(s,-1);
    if(ans != 0x7fffffff)printf("%d\n",ans);
    else printf("No solution\n");
    return 0;
}

原文地址:https://www.cnblogs.com/colazcy/p/11622427.html

时间: 2024-10-18 07:34:46

题解 P5058 【[ZJOI2004]嗅探器】的相关文章

P5058 [ZJOI2004]嗅探器 tarjan割点

这个题是tarjan裸题.最后bfs暴力找联通块就行.(一开始完全写错了竟然得了70分,题意都理解反了...这数据强度...) 题干: 题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息,但是蓝军的网络相当的庞大,数据包从一个信息中心传到另一个信息中心可以不止有一条通路.现在需要你尽快地解决这个问题,应该把嗅探器安装在哪个中间服务器上才能保证所有的数据包都能被捕获? 输入输

Luogu5058 [ZJOI2004]嗅探器

\(\verb|Luogu5058 [ZJOI2004]嗅探器|\) 给定一张 \(n\) 个点, \(m\) 条边的无向图,和两点 \(s,\ t\) ,求 \(s\to t\) 编号最小的必经点(排除 \(s,\ t\) ) \(n\leq100\) tarjan 这题数据范围是可以 \(O(n^3)\) 暴力过的-- 显然只需缩点后的树上 \(bl_s\) 到 \(bl_t\) 上找答案,统计割点贡献即可 然而此题有更简单的做法-- 从 \(s\) 开始 tarjan,点 \(u\) 对答

[zjoi2004]嗅探器

某军搞信息对抗实战演习.红军成功地侵入了蓝军的内部网络. 蓝军共有两个信息中心.红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息.但是蓝军的网络相当的庞大,数据包从一个信息中心传到另一个信息中心可以不止有一条通路.现在需要你尽快地解决这个问题.应该把嗅探器安装在哪个中间服务器上才能保证所有的数据包都能被捕获? 题解:tarjan的简单应用: #include<iostream> #include<cstdio> #include<cstd

矩阵乘法专题3——bzoj 1898 [Zjoi2004]Swamp 沼泽鳄鱼 题解

[原题] 1898: [Zjoi2004]Swamp 沼泽鳄鱼 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 425  Solved: 256 [Submit][Status] Description 潘塔纳尔沼泽地号称世界上最大的一块湿地,它地位于巴西中部马托格罗索州的南部地区.每当雨季来临,这里碧波荡漾.生机盎然,引来不少游客.为了让游玩更有情趣,人们在池塘的中央建设了几座石墩和石桥,每座石桥连接着两座石墩,且每两座石墩之间至多只有一座石桥.这

【ZJOI2004】嗅探器

练tarjian不错的题,连WA几次后终于会记住tarjian的模板了 原题: 某军搞信息对抗实战演习.红军成功地侵入了蓝军的内部网络.蓝军共有两个信息中心.红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息.但是蓝军的网络相当的庞大,数据包从一个信息中心传到另一个信息中心可以不止有一条通路.现在需要你尽快地解决这个问题.应该把嗅探器安装在哪个中间服务器上才能保证所有的数据包都能被捕获? 1<=n<=100000 恩,首先可以确定答案一定是割顶中的某个点,必

【BZOJ1899】[Zjoi2004]Lunch 午餐 贪心+DP

[BZOJ1899][Zjoi2004]Lunch 午餐 Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时刻只能给一个人打饭.由于每个人的口味(以及胃口)不同,所以他们要吃的菜各有不同,打饭所要花费的时间是因人而异的.另外每个人吃饭的速度也不尽相同,所以吃饭花费的时间也是可能有所不同的. THU ACM小组的吃饭计划是这样的:先把所有的人分成两队,并安排好每队中各人的排列顺序,然后一号队伍到一号窗口去排

洛谷 P1079 Vigen&#232;re 密码 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1079 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为 南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用 C 表示:而密钥是一种

8.8联考题解

今天的T1让我怀疑我是不是在做奥赛题--这考的是什么知识点啊这个,会不会用绝对值函数? Evensgn 的债务 时间限制: 1 Sec  内存限制: 128 MB 题目描述 Evensgn 有一群好朋友,他们经常互相借钱.假如说有三个好朋友A,B,C.A 欠 B 20 元,B 欠 C 20 元,总债务规模为 20+20=40 元.Evensgn 是个追求简约的人,他觉得这样的债务太繁杂了.他认为,上面的债务可以完全等价为 A 欠C20 元,B 既不欠别人,别人也不欠他.这样总债务规模就压缩到了 

POJ 2533 - Longest Ordered Subsequence(最长上升子序列) 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:http://poj.org/problem?id=2533 Description A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let the subsequence of the given numeric sequence (a1, a2, ..., aN) be any sequence (ai1, ai2, ..., aiK)