Description

AGC027C

给定一张图,点有标号A或B,计算是否对于任意的一个由AB构成的字符串都在图中有对应的路径。

Solution

观察可以发现,如果有个环(不一定是简单环)是AABB的无限循环,就输出Yes,否则输出No

UPD:对于上面那个结论,这里给出简要证明:当在这个环上任意一个A点时,可以任意的走向AB点,在任意一个B点时也是这样,那么,对于任意字符串,只需走向要求的点即可。

然鹅,话是这么说,码却没有那么好写,我一开始写了dfs找环,但是一直WA,和标程对拍也拍不出来错。所以我就换了一种思路,借用拓扑排序的思想,每次将只与一种字符相连的点删去,如果删完还剩下,那么就说明有一个AABB的环,否则就没有。

Code

拓扑排序版:

#include <cstdio>

const int N = 2e5 + 10;
const int M = 4e5 + 10; int hd[N], nxt[M], to[M], cnt;
int deg[N][2];
int n, m;
char col[N];
int q[N], qhd, qtl, vis[N]; inline void adde(int x, int y) {
cnt++;
to[cnt] = y; nxt[cnt] = hd[x];
hd[x] = cnt;
} int main() {
scanf("%d%d", &n, &m);
scanf("%s", col+1);
for (int i = 1, x, y; i <= m; ++i) {
scanf("%d%d", &x, &y);
adde(x, y);
adde(y, x);
deg[x][col[y] == 'B']++;
deg[y][col[x] == 'B']++;
}
for (int i = 1; i <= n; ++i) {
if (deg[i][0] == 0 || deg[i][1] == 0) vis[q[qtl++] = i] = 1;
}
while (qhd != qtl) {
int x = q[qhd++];
// printf("%d\n", x);
// vis[x] = 1;
for (int i = hd[x]; i; i = nxt[i]) if (!vis[to[i]]) {
if (--deg[to[i]][col[x] == 'B'] == 0) {
vis[to[i]] = 1;
q[qtl++] = to[i];
}
}
}
if (qtl == n) puts("No");
else puts("Yes");
}

最新文章

  1. C++的ORM工具比较
  2. C#中另类自定义公式计算 字符串转换为计算公式,并得出计算结果
  3. CSS3:clip-path具体解释
  4. 4.windows和Linux下创建oracleusername表空间,表,插入数据,用户管理表等操作
  5. Codeforces Round #452 F. Letters Removing
  6. 解决Apache Web Server的几个错误
  7. docker 进入容器的mongodb
  8. Kaggle初学者五步入门指南,七大诀窍助你享受竞赛
  9. ProgressDemo
  10. Python Appium 开启Android测试之路
  11. chrome 隐藏技能之 base64 图片转换
  12. 《ASP.NET MVC 5 破境之道》:概述
  13. 【*】Redis常见问题汇总
  14. mysql-5.7 innodb_buffer_pool刷新机制详解
  15. 撩课-Java每天5道面试题第16天
  16. Mastache.js学习笔记(转自小花喵)
  17. 【C】关键字void的用法
  18. 【NOIP2016】组合数问题
  19. HDUOJ A Mathematical Curiosity 1017
  20. express 创建node服务器

热门文章

  1. svn error: &quot;Previous operation has not finished; run &#39;cleanup&#39; if it was interrupted&quot;
  2. Maven修改test/rsource的output folder报错Test source folder &#39;src/test/java&#39;... is not also used for main s
  3. Codeforces Round #350 (Div. 2)(670C)
  4. shell输入输出
  5. Android_ViewPager+Fragment实现页面滑动和底部导航栏
  6. 分类问题(三)混淆矩阵,Precision与Recall
  7. [SDOI2012] Longge的问题 - 欧拉函数
  8. phpstorm更换主题
  9. Linux常用命令: zip、unzip 压缩和解压缩命令
  10. css给span加float:right右浮动后内容换行下移