题目链接
题意

判断一个有向图是不是仙人掌图

思路

思路看这
代码看这
据说数据水,这个比较详细应该正确
tarjan 先判断图是否强连通
再判断是否为仙人掌

假设图强连通,结论如下
仙人掌图的 DFS 树没有横向边。
设某个点 v 有 a(v)个儿子的 Low 值小于 DFS(v),同时 v 自己有 b(v)条逆向边,那么 a(v)+b(v)<2。

代码
#include <bits/stdc++.h>
using namespace std;const int N = 200005;
vector<int> e[N];
stack<int> st;
int low[N], dfn[N], vis[N], tot, cnt;void tarjan(int u) {low[u] = dfn[u] = ++tot;vis[u] = 1;st.push(u);for(auto v : e[u]) {if(!dfn[v]) tarjan(v), low[u] = min(low[u], low[v]);else if(vis[v]) low[u] = min(low[u], dfn[v]);}if(low[u] == dfn[u]) {++cnt;while(1) {int now = st.top();st.pop();vis[now] = 0;if(now == u) break;}}
}int num[N];
int dfs(int u, int mindfn) {num[u] = 1;int backs = 0;for(auto v : e[u]) {if(num[v] == 1) {++backs;if(backs > 1 || dfn[v] < mindfn) return 0;}}if(backs) mindfn = dfn[u];for(auto v : e[u]) {if(num[v] == 2) return 0;if(num[v] == 0 && dfs(v,mindfn) == 0) return 0;}num[u] = 2;return 1;
}int main() {int t;for(scanf("%d",&t); t; --t) {memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(vis,0,sizeof(vis));tot = cnt = 0;while(!st.empty()) st.pop();int n;scanf("%d",&n);for(int i = 0; i < n; ++i) e[i].clear();int u, v;while(scanf("%d%d",&u,&v),u+v) e[u].push_back(v);for(int i = 0; i < n; ++i) if(!dfn[i]) tarjan(i);memset(num,0,sizeof(num));printf("%s\n",cnt > 1 || dfs(0,dfn[0]) ? "YES" : "NO");}return 0;
}

HDU 3594 Cactus(有向仙人掌图判断)相关推荐

  1. HDU - 3594 Cactus (仙人掌图)

    题意: 给出一个图,判断该图是不是仙人掌图. 分析: 给出仙人掌的详解:https://files-cdn.cnblogs.com/files/ambition/cactus_solution.pdf ...

  2. HDU - 3594 Cactus (强连通缩点+STL)

    题目链接 题意:T组测试样例,每组样例给出一个N,表示(编号为0~N-1)的点有向图,随后给出这个有向图的边,每行是一个u和v,当u==0且v==0时边的输入结束.当每组两个条件时,输出YES,否则输 ...

  3. [BZOJ]1023: [SHOI2008]cactus仙人掌图

    Time Limit: 1 Sec  Memory Limit: 162 MB Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这 ...

  4. [SHOI2008]cactus仙人掌图

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...

  5. 【刷题】BZOJ 1023 [SHOI2008]cactus仙人掌图

    Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...

  6. bzoj 1023: [SHOI2008]cactus仙人掌图(仙人掌求直径)

    1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 3668  Solved: 1535 [Submi ...

  7. BZOJ1023[SHOI2008]cactus仙人掌图 【仙人掌DP】

    题目 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌 图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例来说 ...

  8. BZOJ 1023: [SHOI2008]cactus仙人掌图

    1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2907  Solved: 1212 [Submi ...

  9. cactus仙人掌图【仙人掌圆方树+树形DP+单调队列】

    题目链接 BZOJ 1023 首先,圆方树是比较好想到的,维护直径,我们最方便的做法就是先让它变成一棵树,这里因为是仙人掌图,所以就用圆方树来构建. 再者,就是维护直径了,比较好想到的是非环上结点,就 ...

最新文章

  1. 轻松两步,我在 SpringBoot 服务上实现了接口限流
  2. 每个人都应该了解的“机器学习”
  3. mysql 5.6多实例_MySQL 5.6.x多实例配置
  4. 梦回93年,32岁的Yann LeCun在展示他的卷积网络...
  5. 管理系统中计算机应用第四章重点,管理系统中计算机应用课堂笔记第四章(4)...
  6. 报表设计器条形码支持类型
  7. QLocalServer和QLocalSocket单进程和进程通信
  8. 在PowerPoint 2010中将鼠标用作激光笔
  9. HttpServletResponse说明
  10. Python网络爬虫学习笔记(十):PyQuery库的使用
  11. raid5什么意思?怎样做raid5?raid5 几块硬盘?
  12. 简洁好用的Geek Unіnstaller
  13. vue音乐播放器笔记
  14. php公益培训,周日晚上听seo的课,yy88354001
  15. Discuz_分类信息_字段管理_区域选择_所有地区
  16. 春节后第一周个人新闻两则
  17. Spring AOP基础组件 Advised
  18. 情人节朋友圈秀恩爱九宫格配图
  19. java数组和链表查询效率及增删效率比较
  20. 怎样恢复win10分区误删的数据

热门文章

  1. 第3章 软件测试方法--基于组合技术和组合优化的方法(决策表、因果图、场景测试)
  2. 使用WordPress创建自己的一个网站,超详细……
  3. 超声波传感器+led灯
  4. 什么是Ad-hoc Query
  5. 【STM32】基于STM32F103C8T6的水质检测系统设计(声光报警、多级菜单)
  6. mysql遭遇1577
  7. 如何理解机器人学习和研究中的存量和增量
  8. linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
  9. Java,SQL 截取字符串substring
  10. 基于VUE3+Layui从头搭建通用后台管理系统(前端篇)一:项目规划及初始化