Div1 小A抓小B tarjan双连通分量缩点+dfs

题目描述

A和小B在一个无向图G上进行一个游戏。图G是连通的,有n个点,n条边,无重边,无自环,结点编号为1~n。游戏开始前小A在结点x,小B在结点yxy)。游戏开始后,小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
*/


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P3809-[模板]后缀排序(SA)

正题 题目链接:https://www.luogu.com.cn/problem/P3809 题目大意 长度为nnn的字符串&#xff0c;求它的字符数组(后缀排序后排名为iii的在哪个位置)。 解题思路 大概思路就是倍增排序&#xff0c;先排每个后缀的第一个字符&#xff0c;然后是两个&#xff0c;然后是四个&am…

8、oracle数据库下的索引

ORACLE下的索引 索引是oracle下的一类对象&#xff0c;主要用于提高查询的效率。 1.操作索引 1.1 创建、修改索引 -- 添加一般索引 create index i_test_tname on test(tname); -- 添加唯一索引&#xff0c;不能包含相同的值 create unique index i_test_tname on test(tnam…

使用 C# (.NET Core) 实现模板方法模式 (Template Method Pattern)

本文的概念内容来自深入浅出设计模式一书.项目需求有一家咖啡店, 供应咖啡和茶, 它们的工序如下:咖啡:茶:可以看到咖啡和茶的制作工序是差不多的, 都是有4步, 其中有两步它们两个是一样的, 另外两步虽然具体内容不一样, 但是都做做的同一类工作.现在问题也有了, 当前的设计两个…

P2396-yyylovesMathsVII【状压dp】

正题 题目链接:https://www.luogu.com.cn/problem/P2396 题目大意 nnn个数字&#xff0c;依次选择若干个数字使得没有任何一个前缀和等于厄运数字&#xff0c;厄运数字有mmm个。 解题思路 先预处理出disidis_idisi​表示集合iii的数字和。 然后对于disidis_idisi​不等于厄运…

9、oracle数据库下的视图和同义词

ORACLE下的视图和同义词 1.视图 视图就是一个查询的结果&#xff0c;可能包含一张表或者多张表的信息&#xff0c;创建视图其目的在于&#xff0c;便于查看表中的信息。视图只是在逻辑上存在。 1.1创建/修改视图 创建视图一定要有CREATE VIEW权限&#xff0c;基本语法为&am…

.NET Core Community 首个千星项目诞生:CAP

项目简介在我们构建 SOA 或者 微服务系统的过程中&#xff0c;我们通常需要使用事件来对各个服务进行集成&#xff0c;在这过程中简单的使用消息队列并不能保证数据的最终一致性&#xff0c; CAP 采用的是和当前数据库集成的本地消息表的方案来解决在分布式系统互相调用的各个环…

P2463-[SDOI2008]Sandy的卡片【SA,二分答案】

正题 题目链接:https://www.luogu.com.cn/problem/P2463 题目大意 nnn个长度不同的数字序列&#xff0c;序列的子串相同的定义是该子串相邻的两两差相同。 求公共子串的最长长度。 解题思路 做一个差分后问题就变为了求nnn个串的最长公共子串。 我们将所有的字符串接在一起…

10、oracle下PL/SQL编程基础

ORACLE下的PL/SQL编程基础 PL/SQL语言是程序化程序设计语言&#xff0c;块是PL/SQL编程中的基本结构&#xff0c;其优点在于支持SQL、支持面向对象编程、性能好、可移植性、与sql集成、安全性高等。 1.基本语法 1.1 基本语法结构 [set severoutput on] declare 变量&…

.NET Core 从 Github到 Nuget 持续集成、部署

一.前言Nuget 作为一个.NET研发人员&#xff0c;我想你都不会陌生&#xff0c;他为我们提供非常方便的程序包管理&#xff0c;不管是版本&#xff0c;还是包的依赖都能轻松应对&#xff0c;可以说是我们的好助手。而 Nuget 除了官方nuget.org以外&#xff0c;我们也可以用起提供…

P2336-[SCOI2012]喵星球上的点名【SA,树状数组】

正题 题目链接:https://www.luogu.com.cn/problem/P2336 题目大意 nnn个名字(每个名字两个串)&#xff0c;mmm次点名&#xff0c;如果一次点名里是一个名字两个串中的子串该人就要答到。 对于每次点名求多少个人答到&#xff0c;每个名字求答到多少次。 解题思路 先考虑第一…

11、oracle数据库下的事务和触发器

ORACLE下的事务和触发器 1.事务 事务是数据库的一种机制&#xff0c;当执行一系列操作时&#xff0c;事务可以保证这一系列操作都能完成&#xff0c;在此期间如果出现问题&#xff0c;则这一系列操作导致的结果均回退到原始状态。这样就保证了数据的一致性&#xff0c;事务在…

微软发布自己定制的 Linux 内核和发行版,面向物联网

微软首次发布了自己的定制 Linux 内核和发行版。在旧金山举行的新闻发布会上&#xff0c;微软宣布了针对物联网设备的解决方案 Azure Sphere。Azure Sphere 包含三个组件。其中之一是微软设计的 Sphere MCU&#xff0c;将免费提供给厂商&#xff0c;联发科将在今年晚些时候推出…

P3804-[模板]后缀自动机【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P3804 题目大意 长度为nnn的串&#xff0c;求一个出现次数不小于2的子串使得子串长度乘上出现次数最大。 解题思路 构建SAMSAMSAM的时候统计一下每个子串出现多少次即可。 codecodecode #include<cstdio> #include&l…

MEDIATR 一个低调的中介者类库

微软官方的开源项目eShopOnContainers中&#xff0c;用到了一个实现中介者模式的类库&#xff1a;MediatR。这个类库的作者叫Jimmy Bogard&#xff0c;在其gtihub主页上可以看到&#xff0c;注明的对象映射组件AutoMapper 就是他写的。其博客上的自我介绍是这么写的&#xff1a…

12、oracle数据库下的存储过程和函数

ORACLE下的存储过程和函数 存储过程和函数是一种操作块&#xff0c;用来流程化、整体化处理业务逻辑的数据库操作方式。我理解的是相当于java开发语言中方法的概念&#xff0c;存储过程和函数的区别在于函数可以有返回值&#xff0c;而过程没有返回值。 1.存储过程 -- 创建存…

Codeforces Gym 101173 CERC 16 D BZOJ 4790 Dancing Disks

Codeforces Gym 101173 CERC 16 D & BZOJ 4790 Dancing Disks 强烈安利这道构造题目&#xff0c;非常有意思。 这里用到的思想是归并排序&#xff01; 多路归并排序&#xff01; 我们这样想&#xff0c;假设6*6的网格中除了最后一个网格外&#xff0c;其他的凡是有元素…

P5496-[模板]回文自动机【PAM】

正题 题目链接:https://www.luogu.com.cn/problem/P5496 题目大意 长度为nnn的字符串&#xff0c;求每个字符串作为结尾有多少个回文串。 解题思路 PAMPAMPAM。 下面是个人对PAMPAMPAM的一些理解(不是讲解)&#xff1a; 每个节点表示一个回文串&#xff0c;就是根到其的路径…

ApacheSkyWalking APM 生态衍生多语言监控, 支持 .NET Core

Apache SkyWalking .NET core 探针发布&#xff01;GitHub: https://github.com/apache/incubator-skywalking 码云Gitee: https://gitee.com/OpenSkywalking/sky-walkingApache SkyWalking在4月初&#xff0c;发布了加入Apache孵化器后的第一个版本&#xff1a;5.0.0-alpha。…

13、oracle数据库下的游标

ORACLE下的游标操作 游标是sql的一个内存工作区&#xff0c;由系统或者用户以变量的形式定义。游标的作用是用于临时存储从数据库中提取的数据块。游标有静态游标、动态游标之分&#xff0c;静态游标又可分为隐式游标和显式游标。静态游标是在编译时期就决定了结果集的&#x…

背包系列

庆功会&#xff08;ssl 2289&#xff09; Description 为了庆贺班级在校运动会上取得第一名的成绩&#xff0c;班主任决定开一场庆功会&#xff0c;为此拔款购买奖品奖励运动员&#xff0c;期望拔款金额能购买最大价值的奖品&#xff0c;可以补充他们的精力和体力。 Input …