CodeForces Round 898 (div 4)
H. Mad  City

大致思路   

  • 对于有n条边和n个点,说明这个图里面只有一个环
  • 并且两人同时开始和结束移动,所以可以得到当Valeriu进入到这个图里面的唯一的环里面时,Marcel就无法再抓到他,我们可以把离Valeriu最近的入环点叫做KeyPoint,所以我们就需要考虑Valeriu是否能在Marcel赶到KeyPoint之前赶到KeyPoint。
  • 所以找到入环点是这道题的切入点,找到入环点,我们就可以通过dfs暴搜来得出他们和入环点的距离来,通过比较来得出是否能够逃离。

Key:入环点的寻找

思路来源于洛谷的_Ink大佬

方法是通过拓扑,因为在拓扑的过程中,会一步步去删点删边,最后只剩下一个环。因为是要找离逃离者最近的入环点,所以我们可以把一开始的KeyPoint设为b点,即要逃离者所在地点,当 Keypoint 所在的点将被删时,由拓扑排序的特性,此时仅有一条边与其相连,所以我们可以在删这个点时顺势把KeyPoint 值更新到与被删点相连的那个点上。

由于拓扑排序不会删掉环上的点,所以当 KeyPoint 值不停更新,直到更新到环上的点时就不再发生变化。此时,KeyPoint 值就是我们想要的那个点的编号了。

这道题的图为无向图,所以拓扑过程中的删点删边条件应该为入度为1,这样环上的点就永远不会被删除。

完整代码

#include <bits/stdc++.h>
using namespace std;
const int N = 200060, M = N << 1;
int h[N], ne[M], e[M], idx;
int n, a, b, keypoint;
int to[N];//记录一个点的入度
bool vist[N], st[N];
int dista, distb;//记录a,b离关键点的距离
void add(int a, int b)//链式前向星式建图
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
void topsort(int dot)//对入度为1的点进行拓扑
{
vist[dot] = true;//把这个点标记,表示在此次拓扑中已经被访问
for (int i = h[dot]; ~i; i = ne[i])
{
int j = e[i];
if (vist[j] || to[j]==0)continue;//如果这个点已经被访问过,就跳过
//如果这个点已经被删除也跳过
to[dot]--;
to[j]--;//因为是双向的道路,删边需要两个点的入度都减1
if (dot == keypoint)keypoint = j;//删点,如果这个点是关键点就转移关键点
if (to[j] == 1)topsort(j);//对于入度为1的点进行拓扑
}
vist[dot] = false;//恢复状态
}
void dfs(int x, int dist)//dfs暴搜求a和b到关键点的距离
{
st[x] = true;//标记点已经访问
if (x == a)dista = min(dista, dist);
if (x == b)distb = min(distb, dist);
for (int i = h[x]; ~i; i = ne[i])
{
int j = e[i];
if (st[j])continue;//如果点已经被访问就跳过
dfs(j, dist + 1);
}
st[x] = false;//恢复现场
}
void init()//对于每一次的状态的初始化
{
memset(h, -1, sizeof h);
idx = 0;
memset(to, 0, sizeof to);
memset(st, 0, sizeof st);
memset(vist, 0, sizeof vist);
dista = distb = 0x3f3f3f3f;
}
void solve()
{
cin >> n >> a >> b;
init();
keypoint = b;
for(int i=1;i<=n;i++)
{
int u, v;
cin >> u >> v;
add(u, v);
add(v, u);
to[u]++;
to[v]++;//因为是双向道路,所以两个点的入度都+1
}
for (int i = 1; i <= n; i++)if (to[i] == 1)topsort(i);
//找到入度为1的点进行拓扑
if (to[b] >= 2 && a != b)//如果一开始b就在环上,而且a没有和b在同一栋大楼,就说明可以无期限逃
{
cout << "YES" << endl;
return;
}
else if (a == b) {//如果a和b在同一栋大楼,就直接被抓了
cout << "NO" << endl;
return;
}
dfs(keypoint, 0);//DFS查找a和b两点离关键点的距离 //如果a到关键点的距离大于b到关键点的距离,说明b可以比a先到环上,所以可以无期限逃,反之不可以
if (dista > distb)cout << "YES" << endl;
else cout << "NO" << endl;
}
int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}

CodeForces Round 898 (div 4) H题解析的更多相关文章

  1. Codeforces Round #378 (Div. 2) D题(data structure)解题报告

    题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...

  2. Codeforces Round #612 (Div. 2) 前四题题解

    这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...

  3. Codeforces Round #833 (Div. 2)补题

    Codeforces Round #833 (Div. 2) D. ConstructOR 知识点:高位和对低位无影响 一开始以为和广州的M一样,是数位dp,后来发现只要找到一个就行 果然无论什么时候 ...

  4. Codeforces Round #552 (Div. 3) A题

    题目网址:http://codeforces.com/contest/1154/problem/ 题目意思:就是给你四个数,这四个数是a+b,a+c,b+c,a+b+c,次序未知要反求出a,b,c,d ...

  5. Codeforces Round #713 (Div. 3)AB题

    Codeforces Round #713 (Div. 3) Editorial 记录一下自己写的前二题本人比较菜 A. Spy Detected! You are given an array a ...

  6. Codeforces Round #412 Div. 2 补题 D. Dynamic Problem Scoring

    D. Dynamic Problem Scoring time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  7. [每日一题2020.06.11]Codeforces Round #644 (Div. 3) H

    A-E见 : 这里 题目 我觉得很有必要把H拿出来单独发( 其实是今天懒得写题了 ) problem H 一个从 1 到 $ 2^m - 1$ 的长度为m的连续二进制序列, 删去指定的n个数, 问剩余 ...

  8. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  9. Codeforces Round #425 (Div. 2))——A题&&B题&&D题

    A. Sasha and Sticks 题目链接:http://codeforces.com/contest/832/problem/A 题目意思:n个棍,双方每次取k个,取得多次数的人获胜,Sash ...

  10. Codeforces Round #579 (Div. 3) 套题 题解

    A. Circle of Students      题目:https://codeforces.com/contest/1203/problem/A 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...

随机推荐

  1. mariadbl数据库环境迁移

    前言: 数据库的主要作用就是对数据进行保存和维护,所以备份数据是数据库管理中最常用的操作.为了防止数据库意外崩溃或硬件损伤而导致的数据丢失,数据库系统提供了备份和恢复策略.保证数据安全的最重要的一个措 ...

  2. 前后端分离使用mp遇到问题

    <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-s ...

  3. 淘宝打单发货接口,淘宝打单发货API

    许多做系统功能的小伙伴经常面对的一个功能是对接淘宝开放平台,在自己系统中进行打单发货. 但是,目前淘宝开放平台,已经关闭了相关的相关的权限申请,具体可查看相关公告.有需要这个权限的,可以站内信联系我, ...

  4. net core中byte数组如何高效转换为16进制字符串

    在 .NET Core 中,如何把 byte[] 转换为 16 进制字符串?你能想到哪些方法?什么方式性能最好?今天和大家分享几种转换方式. 往往在处理字符串性能问题时,首先应该想到的是怎么想办法减少 ...

  5. C++ | 每一个C++程序员都应该知道的RAII

    导读:RAII是C++中一种管理资源.避免资源泄漏的惯用法,利用栈的特点来实现.本文较为详细介绍了RAII的原理.使用方法和优点,并且通过实例讲解了RAII在C++ STL中的应用,如智能指针和互斥锁 ...

  6. FastGPT 正式接入 Flux,准备好迎接 AI 绘画的狂风了么?

    Flux 大家最近都听说了吧?它是一款新推出的 AI 绘画模型,拳打 Stable Diffusion 3,脚踢 Midjourney,整个 AI 绘画界都沸腾了. Flux 的主创团队来自由 Sta ...

  7. 合合信息推出国央企智能文档处理解决方案,AI赋能信创国产化

    信息时代,数字化转型已成为推动经济高质量发展的关键力量.国央企是国民经济的重要支柱,其数字化转型进程关乎着自身与产业链上下游企业的共同发展.文档的智能化处理可有效提升信息流转的效率.促进知识的沉淀与传 ...

  8. OData – 坑

    前言 OData 有很多很多的坑,我的主张是能少用一样是一样,比如 Batch Processing 不要用,Inheritance 不要用,除了 GET 其它 PUT POST DELETE 都不要 ...

  9. HTML – Native Form 原生表单功能集

    前言 以前写过 form 表单, 但很不齐全, 这篇想做一个大整理. 主要讲讲在网站中使用原生 Form 的功能, 不足和扩展. 前端是原生的 HTML/JS, 后端是 ASP.NET Core Ra ...

  10. CSS – min(), max(), clamp()

    介绍 它们类似 calc(). 用来通过 formula 输出一个值. 用于 font-size, width, height 之类的, 这些地方. 非常适合用来做 RWD 哦 (特别是 font-s ...