练tarjian不错的题,连WA几次后终于会记住tarjian的模板了

原题:

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

1<=n<=100000

恩,首先可以确定答案一定是割顶中的某个点,必要性:因为删掉这个点后s和t就不连通了,所以这个点是割点,但是这个条件不充分,比如下面这个图:

1也是割顶,但是删掉1后s和t依旧联通,也就是说某个割顶可能并不在s到t的必经路上

然而tarjian求出的dfn和low当然不能只拿来求割顶和强连通分量,用处还是挺广泛的

做法:在tarjian中,如果某点x,连接x的某条边的另一端点y,满足x!=s && low[y]>=dfn[x] && dfn[y]<=dfn[t] && low[t]>=dfn[x]

这四个条件的意义分别是:x当然不能是s;x是割点;y要在t之前遍历到;t走第二条路径到不了x(这几个条件描述有点奇怪,看不懂的无视就好= =)

其它几个条件都好理解,y要在t之前遍历到,也就是low[y]>=dfn[x]这个条件我想了很久(而且是试对的)

为什么呐:

充分性:如果x在y之后遍历,则y已经通过某条路径从s到t了(就是tarjian的dfs路径),删掉x后s依旧可以通过这个路径到t,x就不是所求的点

然后就是tarjian的模板辣

小技巧:因为只求最小的答案,所以不用把答案都存下来,ans=min(ans,x);即可

似乎用费用流也可以做?拆点,入点和出点之间权值为1,费用为点的序号,原图中边权值为oo,从s到t费用流,好像是对的?

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. using namespace std;
  7. int read(){int z=,mark=; char ch=getchar();
  8. while(ch<''||ch>''){if(ch=='-')mark=-; ch=getchar();}
  9. while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
  10. return z*mark;
  11. }
  12. struct ddd{int next,y;}e[]; int LINK[],ltop=;
  13. inline void insert(int x,int y){e[++ltop].next=LINK[x];LINK[x]=ltop;e[ltop].y=y;}
  14. int n,s,t;
  15. int dfn[],low[],dfs_cnt=;
  16. bool visited[];
  17. int ans=;
  18. void tarjian(int x,int _father){
  19. visited[x]=true;
  20. dfn[x]=low[x]=++dfs_cnt;
  21. for(int i=LINK[x];i;i=e[i].next){
  22. if(!visited[e[i].y]){
  23. tarjian(e[i].y,x);
  24. low[x]=min(low[x],low[e[i].y]);
  25. if(x!=s && low[e[i].y]>=dfn[x] && dfn[e[i].y]<=dfn[t] && low[t]>=dfn[x]) ans=min(ans,x);
  26. }
  27. else if(e[i].y!=_father) low[x]=min(low[x],dfn[e[i].y]);
  28. }
  29. }
  30. int main(){
  31. freopen("ddd.in","r",stdin);
  32. freopen("ddd.out","w",stdout);
  33. memset(visited,,sizeof(visited));
  34. cin>>n;
  35. int _left,_right;
  36. for(;;){
  37. _left=read(),_right=read();
  38. if(!_left && !_right) break;
  39. insert(_left,_right),insert(_right,_left);
  40. }
  41. cin>>s>>t;
  42. tarjian(s,);
  43. if(ans>n) cout<<"No solution"<<endl;
  44. else cout<<ans<<endl;
  45. return ;
  46. }

【ZJOI2004】嗅探器的更多相关文章

  1. Luogu5058 [ZJOI2004]嗅探器

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

  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. Luogu5058 ZJOI2004嗅探器(割点)

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

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

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

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

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

  10. tarjan 算法应用

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

随机推荐

  1. 客户端判断是否为IE9以上版本

    function detectBrowser() { var browser = navigator.appName if(navigator.userAgent.indexOf("MSIE ...

  2. LINUX CP 跳过询问是否覆盖

    有两个方法可以解决此问题: 1..bashrc里面注释掉 Alias cp='cp -i' 2.使用 \cp 命令(在cp前加一个'\')

  3. Head First 设计模式--2 观察者模式 解耦

    观察者模式定义了对象之间一对多的依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 假如有这么一个项目,监控每天的天气状况WeatherData(温度,湿度,气压).有布告板 ...

  4. openssl evp 哈希算法(md5,sha1,sha256)

    1. 简述 openssl提供了丰富密码学工具,一些常用的哈希算法 比如md5,sha 可以直接用提供的md5.h ,sha.h 接口使用: 为了方便开发者使用,openssl 又提供了一个EVP, ...

  5. 谷歌 火狐 CSS兼容

    @media screen and (-webkit-min-device-pixel-ratio:0){}谷歌@-moz-document url-prefix(){}火狐

  6. windows docker测试二 下载container

    安装dockertoolbox,提供了一个docker的界面工具 Kitematic 和字符终端: Docker Quickstart Terminal (这里安装的Kitematic 是Alpha版 ...

  7. PDF 补丁丁 0.4.2.950 测试版发布:按文件夹合并生成单独的PDF文件

    新的测试版实现了将文件夹的内容合并为单独的PDF文件的功能.以下图为例讲解操作步骤. 点击工具栏的“合并文件”按钮,打开合并功能. 设M盘下有“test”和“test2”文件夹,里面包含了需要合并的文 ...

  8. oracle给字段添加描述

    oracle中,我们有时候需要给表的字段添加描述.用以下语句即可. alter table a add b varchar2(2); comment on column a.b  is '这是表a的字 ...

  9. IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)

    问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10   分析: 2*2子数组的最大和.遍历求和,时 ...

  10. opencv基本的数据结构(转)

    DataType : 将C++数据类型转换为对应的opencv数据类型 enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, ...