HDU 3594 Cactus(有向仙人掌图判断)
题目链接
题意
判断一个有向图是不是仙人掌图
思路
思路看这
代码看这
据说数据水,这个比较详细应该正确
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(有向仙人掌图判断)相关推荐
- HDU - 3594 Cactus (仙人掌图)
题意: 给出一个图,判断该图是不是仙人掌图. 分析: 给出仙人掌的详解:https://files-cdn.cnblogs.com/files/ambition/cactus_solution.pdf ...
- HDU - 3594 Cactus (强连通缩点+STL)
题目链接 题意:T组测试样例,每组样例给出一个N,表示(编号为0~N-1)的点有向图,随后给出这个有向图的边,每行是一个u和v,当u==0且v==0时边的输入结束.当每组两个条件时,输出YES,否则输 ...
- [BZOJ]1023: [SHOI2008]cactus仙人掌图
Time Limit: 1 Sec Memory Limit: 162 MB Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这 ...
- [SHOI2008]cactus仙人掌图
Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...
- 【刷题】BZOJ 1023 [SHOI2008]cactus仙人掌图
Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的 ...
- bzoj 1023: [SHOI2008]cactus仙人掌图(仙人掌求直径)
1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3668 Solved: 1535 [Submi ...
- BZOJ1023[SHOI2008]cactus仙人掌图 【仙人掌DP】
题目 如果某个无向连通图的任意一条边至多只出现在一条简单回路(simple cycle)里,我们就称这张图为仙人掌 图(cactus).所谓简单回路就是指在图上不重复经过任何一个顶点的回路. 举例来说 ...
- BZOJ 1023: [SHOI2008]cactus仙人掌图
1023: [SHOI2008]cactus仙人掌图 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2907 Solved: 1212 [Submi ...
- cactus仙人掌图【仙人掌圆方树+树形DP+单调队列】
题目链接 BZOJ 1023 首先,圆方树是比较好想到的,维护直径,我们最方便的做法就是先让它变成一棵树,这里因为是仙人掌图,所以就用圆方树来构建. 再者,就是维护直径了,比较好想到的是非环上结点,就 ...
最新文章
- 轻松两步,我在 SpringBoot 服务上实现了接口限流
- 每个人都应该了解的“机器学习”
- mysql 5.6多实例_MySQL 5.6.x多实例配置
- 梦回93年,32岁的Yann LeCun在展示他的卷积网络...
- 管理系统中计算机应用第四章重点,管理系统中计算机应用课堂笔记第四章(4)...
- 报表设计器条形码支持类型
- QLocalServer和QLocalSocket单进程和进程通信
- 在PowerPoint 2010中将鼠标用作激光笔
- HttpServletResponse说明
- Python网络爬虫学习笔记(十):PyQuery库的使用
- raid5什么意思?怎样做raid5?raid5 几块硬盘?
- 简洁好用的Geek Unіnstaller
- vue音乐播放器笔记
- php公益培训,周日晚上听seo的课,yy88354001
- Discuz_分类信息_字段管理_区域选择_所有地区
- 春节后第一周个人新闻两则
- Spring AOP基础组件 Advised
- 情人节朋友圈秀恩爱九宫格配图
- java数组和链表查询效率及增删效率比较
- 怎样恢复win10分区误删的数据