P5058 [ZJOI2004]嗅探器 tarjan割点
这个题是tarjan裸题。最后bfs暴力找联通块就行。(一开始完全写错了竟然得了70分,题意都理解反了。。。这数据强度。。。)
题干:
题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息,但是蓝军的网络相当的庞大,数据包从一个信息中心传到另一个信息中心可以不止有一条通路。现在需要你尽快地解决这个问题,应该把嗅探器安装在哪个中间服务器上才能保证所有的数据包都能被捕获?
输入输出格式
输入格式: 输入文件的第一行一个整数 n,表示蓝军网络中服务器的数目。 接下来若干行是对蓝军网络的拓扑结构描述,每行是两个整数 i , j 表示编号为 i 和编号为 j 的两台服务器间存在连接(显然连接是双向的),服务器的编号从 开始,一行两个 表示网络的拓补结构描述结束,再接下来是两个整数 a , b 分别表示两个中心服务器的编号。 输出格式: 输出编号。如果有多个解输出编号最小的一个,如果找不到任何解,输出 No solution
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;
#define duke(i,a,n) for(register int i = a;i <= n;++i)
#define lv(i,a,n) for(register int i = a;i >= n;--i)
#define clean(a) memset(a,0,sizeof(a))
const int INF = << ;
typedef long long ll;
typedef double db;
template <class T>
void read(T &x)
{
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x)
{
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
}
const int N = 1e5 + ;
struct node
{
int l,r,nxt;
}a[N * ];
int n,A,B;
int x,y;
int lst[N],len,cnt = ,dfn[N],low[N];
int cut[N],child = ;
void add(int x,int y)
{
// cout<<x<<" "<<y<<endl;
a[++len].l = x;
a[len].r = y;
a[len].nxt = lst[x];
lst[x] = len;
}
void tarjan(int x,int fa)
{
dfn[x] = low[x] = cnt++;
for(int k = lst[x];k;k = a[k].nxt)
{
int y = a[k].r;
if(!dfn[y])
{
tarjan(y,x);
low[x] = min(low[x],low[y]);
if(low[y] >= dfn[x] && x != fa)
{
cut[x] = ;
}
if(x == fa)
{
child++;
}
}
low[x] = min(low[x],dfn[y]);
}
if(child >= && x == fa)
{
cut[x] = ;
}
}
bool vis[N];
bool check(int x)
{
clean(vis);
queue <int> q;
vis[A] = ;
q.push(A);
while(!q.empty())
{
int now = q.front();
q.pop();
// cout<<now<<"???"<<endl;
if(now == x) continue;
for(int k = lst[now];k;k = a[k].nxt)
{
int y = a[k].r;
if(vis[y] == ) continue;
if(y == x) continue;
if(y == B) return false;
vis[y] = ;
q.push(y);
}
}
return true;
}
int main()
{
read(n);
while()
{
read(x);read(y);
if(x == && y == )
{
break;
}
add(x,y);
add(y,x);
}
read(A);read(B);
duke(i,,n)
{
if(!dfn[i])
{
tarjan(i,i);
}
}
duke(i,,n)
{
if(i == A || i == B) continue;
if(cut[i])
{
// cout<<i<<endl;
if(check(i) == true)
{
printf("%d\n",i);
return ;
}
}
}
printf("No solution\n");
return ;
}
P5058 [ZJOI2004]嗅探器 tarjan割点的更多相关文章
- 洛谷P5058 [ZJOI2004]嗅探器
题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息,但是蓝军的网络相当的庞大 ...
- luogu P5058 [ZJOI2004]嗅探器
题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心互相交换的所有信息,但是蓝军的网络相当的庞大 ...
- Luogu5058 ZJOI2004嗅探器(割点)
数据范围过小怎么做都行.考虑优秀一点的做法.考虑dfs树上两台中心服务器间的路径,路径上所有能割掉中心服务器所在子树的点均可以成为答案.直接从两点中的任意一点开始dfs就更方便了.一开始弱智的以为只要 ...
- Luogu5058 [ZJOI2004]嗅探器
$Luogu5058 [ZJOI2004]嗅探器 给定一张 \(n\) 个点, \(m\) 条边的无向图,和两点 \(s,\ t\) ,求 \(s\to t\) 编号最小的必经点(排除 \(s,\ t ...
- ⌈洛谷5058⌋⌈ZJOI2004⌋嗅探器【Tarjan】
题目连接 [洛谷传送门] [LOJ传送门] 题目描述 某军搞信息对抗实战演习,红军成功地侵入了蓝军的内部网络,蓝军共有两个信息中心,红军计划在某台中间服务器上安装一个嗅探器,从而能够侦听到两个信息中心 ...
- [ZJOI2004]嗅探器 (割点)
这题就比较好玩吧水题 以数据范围来看随便怎么做就能过 \(O(n)\)显然我们得过一个割点,其次这个割点得在\(x-y\)中间且不为始终点 其他都好说,在中间:从\(x\)开始遍历,首先得保证\(x- ...
- [ZJOI2004]嗅探器
题目概要: 在无向图中寻找出所有的满足下面条件的点:割掉这个点之后,能够使得一开始给定的两个点a和b不连通,割掉的点不能是a或者b.(ZJOI2004) 数据范围约定结点个数N≤100边数M≤N*(N ...
- 【UOJ#67】新年的毒瘤 Tarjan 割点
#67. 新年的毒瘤 UOJ直接黏贴会炸... 还是戳这里吧: http://uoj.ac/problem/67#tab-statement Solution 看到这题的标签就进来看了一眼. 想 ...
- BZOJ2730 [HNOI2012]矿场搭建 - Tarjan割点
Solution 输入中没有出现过的矿场点是不用考虑的, 所以不用考虑只有 一个点 的点双联通分量. 要使某个挖矿点倒塌, 相当于割去这个点, 所以我们求一遍割点和点双联通分量. 之后的点双联通分量构 ...
随机推荐
- Java基本输入输出
Java基本输入输出 基本输入 基本输出 package com.ahabest.demo; public class Test { public static void main(String[] ...
- list查询棚舍面积的时候,所有棚舍面积的value都是一样的
解决办法 将pickingid在查list之前set到对象中,通过id来匹配查询 具体代码: FarmHouse farmHouse=new FarmHouse(); farmHouse.setPic ...
- Python之实例属性和类属性
参考原文 廖雪峰Python 实例属性和类属性 在前面已经说过由于Python是动态语言,可以根据类的实例绑定任何的属性. 给实例绑定属性的方法是通过实例变量,或者self变量绑定的: class S ...
- Python&机器学习总结(二)
① Python中的Sort Python中的内建排序函数有 sort()和sorted()两个 list.sort(func=None, key=None, reverse=False(or Tru ...
- <MyBatis>入门四 传入的参数处理
1.单个参数 传入单个参数时,mapper文件中 #{}里可以写任意值 /** * 传入单个参数 */ Employee getEmpById(Integer id); <!--单个参数 #{} ...
- gnulpot
gnulpot Table of Contents 1. Label position 2. coordinates 3. Symbols 4. key 4.1. key position 4.2. ...
- 阿里巴巴json包 --------fastjson
fastjson对null的处理----String str2 = JSONObject.toJSONString(jsonMap, SerializerFeature.WriteMapNullVal ...
- Leetcode 90.子集
子集 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], ...
- MVC系统学习2—MVC路由
在MVC下不是通过对物理文件的映射来实行访问的,而是通过定义后的路由Url来实现访问的.在前一篇讲到我们是在全局文件下进行路由配置. routes.MapRoute( & ...
- I - Navigation Nightmare 并查集
Farmer John's pastoral neighborhood has N farms (2 <= N <= 40,000), usually numbered/labeled 1 ...