题目描述

小A和小B在一个无向图G上进行一个游戏。图G是连通的,有n个点,n条边,无重边,无自环,结点编号为1~n。游戏开始前小A在结点x,小B在结点y(x≠y)。游戏开始后,小A和小B轮流进行移动(小A先移动),每次移动可以从当前结点移动到与当前结点相邻的某个结点。小A的目标是抓到小B(某一次移动之后小A与小B在同一个结点),小B的目标是不被小A抓到。两人都有图G的地图,并且知道对方在哪个结点,两人都采取最优策略,问小A是否能通过有限次移动抓到小B。

输入描述

第1行3个整数n、x、y

第2~n+1行每行2个整数u、v,代表u与v之间有边相连。

输出描述

若小A能通过有限次移动抓到小B,输出1,否则输出0。

数据范围

n≤100000

样例输入

10 2 4
1 2
1 3
2 4
1 5
5 6
1 7
5 8
6 9
3 10
8 10

样例输出

1

题解,这是一个树,并且这个树上存在且存在一个环。

1.当A和B之间距离为1或0的时候,直接输出1。

2.否则的话,当环的长度小于等于3的时候,直接输出1,因为B一定会被A捉到。

3.我们进行双连通分量的缩点,将环缩成一个点,下面我们判断,当A、B同属于一个环上的时候,直接输出0,因为B绕着环跑永远不会被捉到。

4.然后我们从环缩成的点开始进行dfs序遍历,得到每一个点到基环的距离,如果dis[belong[x]] + 1 <= dis[belong[y]]表明A距离基环更近,直接输出1,否则输出0.

代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+10;
int head[MAXN];
int cnt;
struct edge{ int v; int next; int cost;
}Es[MAXN<<1];
void init(){ cnt = 0; memset(head,-1,sizeof(head));
}
inline void add_edge(int i,int j,int cost){   Es[cnt].v = j; Es[cnt].cost = cost; Es[cnt].next = head[i]; head[i] = cnt++;
}
int n,x,y;
int DFN[MAXN],LOW[MAXN];
int stk[MAXN],vis[MAXN],belong[MAXN];
int idx,sccnum,tot;
vector<int> scc[MAXN];
void tarjan(int x,int fa){DFN[x] = LOW[x] = ++ tot;stk[++idx] = x;vis[x] = 1;for(int e = head[x];e != -1;e = Es[e].next){int v = Es[e].v;if(v == fa) continue;if(!DFN[v]){tarjan(v,x);LOW[x] = min(LOW[x],LOW[v]);}else if(vis[v]){LOW[x] = min(LOW[x],DFN[v]);}}if(DFN[x] == LOW[x]){++sccnum;int item;do{item = stk[idx--];belong[item] = sccnum;scc[sccnum].push_back(item);vis[item] = 0;}while(x != item);}
}
int dis[MAXN];
int vis2[MAXN];
void dfs(int x,int dep){dis[x] = dep;for(int i  = 0;i < scc[x].size();++i){int u = scc[x][i];for(int e = head[u];e != -1;e = Es[e].next){int v = Es[e].v;if(!vis2[belong[v]]){vis2[belong[v]] = 1;dfs(belong[v],dep+1);}}}
}
int main(){init();scanf("%d%d%d",&n,&x,&y);if(x == y) {puts("1");return 0;}for(int i = 0;i < n;i++){int a,b;scanf("%d%d",&a,&b);add_edge(a,b,1);add_edge(b,a,1);}for(int e = head[x];e != -1;e = Es[e].next){int v = Es[e].v;if(v == y){puts("1");return 0;}}tarjan(1,0);int start = 0;for(int i = 1;i <= sccnum;i++){if(scc[i].size() > 3){start = i;}}if(!start){puts("1");return 0;}if(belong[x] == belong[y]){puts("0");return 0;}dfs(start,0);if(dis[belong[x]] + 1 <= dis[belong[y]]){puts("1");}else{puts("0");}return 0;
}
/*
7 4 1
1 2
2 3
3 4
4 5
5 6
6 7
7 4
*/

Div1 小A抓小B tarjan双连通分量缩点+dfs相关推荐

  1. AcWing 397. 逃不掉的路(边双连通分量缩点成树 + 树链剖分乱搞)

    整理的算法模板合集: ACM模板 我们知道在同一个边双连通分量中的点没有必经边(因为至少有两条分离的路径). 所以我们直接tarjan求出桥后缩点,然后求一下树上两点间的距离即可. 那么如何求树上两点 ...

  2. Tarjan算法求解桥和边双连通分量(附POJ 3352 Road Construction解题报告)

    http://blog.csdn.net/geniusluzh/article/details/6619575 在说Tarjan算法解决桥和边双连通分量问题之前我们先来回顾一下Tarjan算法是如何求 ...

  3. tarjan算法与无向图的连通性(割点,桥,双连通分量,缩点)

    基本概念 给定无向连通图G = (V, E) 割点: 对于x∈V,从图中删去节点x以及所有与x关联的边之后,G分裂为两个或两个以上不相连的子图,则称x为割点 割边(桥) 若对于e∈E,从图中删去边e之 ...

  4. 双连通分量(点-双连通分量边-双连通分量)

    概念: 双连通分量有点双连通分量和边双连通分量两种.若一个无向图中的去掉任意一个节点(一条边)都不会改变此图的连通性,即不存在割点(桥),则称作点(边)双连通图. 一个无向图中的每一个极大点(边)双连 ...

  5. POJ 3694 Network ★(边双连通分量+并查集缩点+LCA)

    [题意]一个无向图可以有重边,下面q个操作,每次在两个点间连接一条有向边,每次连接后整个无向图还剩下多少桥(每次回答是在上一次连边的基础之上) [分析]好题,做完后涨了很多姿势~ 普通做法当然就是每加 ...

  6. 无向图双连通分量BCC(全网最好理解)

    不是标题党,之前我也写过一篇比较全的,但是对于初学者不友好.传送门? 双连通分量(Biconnected component):     1.边双联通 E-BCC     2.点双连通 V-BCC 双 ...

  7. BZOJ 2959: 长跑 [lct 双连通分量 并查集]

    2959: 长跑 题意:字词加入边,修改点权,询问两点间走一条路径的最大点权和.不一定是树 不是树? 把边双连通分量缩为一点! 怎么缩? 用一个并查集维护连通性,另一个并查集维护每个点所在边双的编号, ...

  8. 双连通分量的题目列表(一)

    双连通分量:定义:给一个无向图,其中的极大子图中的每个点两两可达,那么就说明这个是一个双连通分量. 点双连通:如果任意两点至少存在两条点不重复的路径,则说明这个图是点双连通. 点双连通的一些特点 ①每 ...

  9. 小黄鸟抓包京东APPCK

    首先下载小黄鸟抓包软件(这就不用多说了吧) 下载地址 然后安装,记得一定要安装CA证书,不然很多抓不了 打开黄鸟,把目标应用设置为京东 点击左下角小飞机,开始抓包 打开京东,抓一会儿 停止抓包,打开黄 ...

最新文章

  1. C++_STL标准库——容器
  2. 【SSH网上商城项目实战23】完成在线支付功能
  3. 整了个程序员专用的红包封面,喜欢的来领咯!
  4. tf.clip_norm
  5. Activiti实战. 1.5Activiti架构与组件
  6. Angular2.0快速开始
  7. lock mysql unlock_MySQL中的lock tables和unlock tables
  8. n型半导体和p型半导体的区别_VNX系列大流量工业型膜堆, 为半导体等行业提供超纯水!...
  9. /var/spool/clientmqueue/下的大文件
  10. linux下重启tomcat,日志查看
  11. Android实现App版本检测、下载与安装新版本apk
  12. 禧龙字王 v1.0 beta 4 工作站版 是什么
  13. 浏览器window对象
  14. python_opencv_haze加雾处理
  15. HW2021攻防演练经历碎碎念-见解
  16. VR医疗平台Osso VR完成6600万美元C轮融资
  17. 教程:MySQL 8安装与配置及注意事项
  18. 西门子S7通信协议中TSAP的确认
  19. 微信小程序在开发者工具和预览下边跳转都好好的真机预览就找不到页面,报错 {“errMsg“:“navigateTo:fail page \“***\“ is not found“}
  20. 亚信科技:新业务成高速增长源动力,吹响全栈式数智化转型号角

热门文章

  1. mac 配置php和mysql_Mac下配置PHP+MySql环境
  2. python递归函数查询表_python---------------递归函数
  3. 组件库实战 | 教你如何设计Web世界中的表单验证
  4. [mybatis]映射文件_参数处理
  5. [JavaWeb-MySQL]多表查询概述
  6. 高等数学下-赵立军-北京大学出版社-题解-练习12.3
  7. [Java基础]数据输入
  8. AcWing 756. 蛇形矩阵
  9. DDIA笔记—第六章 数据分区
  10. python目标跟踪精度曲线图_Python+opencv3.4+Kalman滤波在视频中跟踪绘制运动目标,Pythonopencv34kalman,卡尔曼滤波,实现,物体,追踪,和,轨迹...