题意:

给出一个图,判断该图是不是仙人掌图。

分析:

给出仙人掌的详解:https://files-cdn.cnblogs.com/files/ambition/cactus_solution.pdf

文档中介绍了仙人掌图的三个性质:

性质 1: 仙人掌图的 DFS树没有横向边。
性质 2: Low[v] <= DFN[u] (v 是 u 的儿子) 
性质 3: 设某个点 u 有 a(u) 个儿子的 low 值小于 DFN[u] ,同时 u 自己有 b(u) 条反向边。那么 a(u) + b(u) < 2。

#include<cstring>
#include<cstdio>
#include<queue>
#include<vector>using namespace std;const int maxn=1e5+10;
const int maxm=1e5+10;struct node{int to,next;
}edge[maxm];int head[maxn],tot;int low[maxn],dfn[maxn],sta[maxn],belong[maxn];
int index,top;
int scc;            //强连通分量的个数。
bool instack[maxn];
int num[maxn];
int fa[maxn];void addedge(int u,int v){edge[tot].to=v;edge[tot].next=head[u];head[u]=tot++;
}bool flag;void tarjan(int u){int v;low[u]=dfn[u]=++index;sta[top++]=u;instack[u]=true;for(int i=head[u];i!=-1;i=edge[i].next){v=edge[i].to;if(!dfn[v]){fa[v]=u;tarjan(v);if(low[u]>low[v]) low[u]=low[v];}else if(instack[v]){if(dfn[v]<low[u]) low[u]=dfn[v];int tmp=u;while(v!=fa[tmp]){num[tmp]++;if(num[tmp]>1){flag=1;return ;}tmp=fa[tmp];}}}if(low[u]==dfn[u]){scc++;do{v=sta[--top];instack[v]=false;belong[v]=scc;}while(v!=u);}
}int in[maxn],out[maxn];void init(){scc=top=tot=index=0;memset(head,-1,sizeof head);memset(dfn,0,sizeof dfn);memset(instack,0,sizeof instack);memset(num,0,sizeof num);flag=0;memset(fa,0,sizeof fa);
}int main(){int T;scanf("%d",&T);for(int cs=1;cs<=T;cs++){int n;init();scanf("%d",&n);while(1){int u,v;scanf("%d%d",&u,&v);if(u==0&&v==0) break;u++,v++;addedge(u,v);}for(int i=1;i<=n;i++){if(!dfn[i]){tarjan(i);}}
//        printf("%d\n",num[0]);if(scc>1||flag){printf("NO\n");}else printf("YES\n");}return 0;
}

HDU - 3594 Cactus (仙人掌图)相关推荐

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

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

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

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

  3. HDU 3594 Cactus(有向仙人掌图判断)

    题目链接 题意 判断一个有向图是不是仙人掌图 思路 思路看这 代码看这 据说数据水,这个比较详细应该正确 tarjan 先判断图是否强连通 再判断是否为仙人掌 假设图强连通,结论如下 仙人掌图的 DF ...

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

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

  5. [SHOI2008]cactus仙人掌图

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

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

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

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

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

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

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

  9. BZOJ.1023.[SHOI2008]cactus仙人掌图(DP)

    题目链接 类似求树的直径,可以用(类似)树形DP求每个点其子树(在仙人掌上就是诱导子图)最长链.次长链,用每个点子节点不同子树的 max{最长链}+max{次长链} 更新答案.(不需要存次长链,求解过 ...

最新文章

  1. 派生类参数初始化列表和基类构造函数顺序
  2. jsp 修改的员工select怎么_SpringBoot+Mybatis+Jsp 员工管理系统
  3. java代码中哪些不能犯的错误_Java程序员工作中千万不能犯的3个低级错误
  4. 频率概率与贝叶斯概率
  5. 11月22日北京.net俱乐部活动ppt下载以及11月19日微软西格玛IE8开发讲座ppt下载
  6. MySQL 性能监控 4 大指标
  7. win2003 server重启故障
  8. Ceres Solver安装
  9. Spring Boot 之异步执行方法
  10. 监听程序不支持服务 linux,ORA-12520: TNS: 监听程序无法为请求的服务器类型找到可用的处理程序...
  11. 解决学校版本mac matlab2019b一启动就应用程序无响应的办法
  12. 消失的遗传力--wiki
  13. 计算机撤销英语,正在撤销对计算机所做的更改要等多久
  14. 《网络黑白》一书所抄袭的文章列表
  15. win11安装Pandoc
  16. 链塔智库联合清华发布《2018区块链技术应用白皮书》
  17. 微信读书怎么导入txt
  18. FPGA Vs 单片机 -- 嵌入式设计的另一种方法
  19. 部署dashboard
  20. java山地车火山_2019“JAVA(佳沃)杯”第十届凤凰山山地自行车挑战赛

热门文章

  1. ULua Simpleframework环境安装详解
  2. Python 二次开发 SAP2000 绘制
  3. 区块链-链上云计算应用技术沙龙
  4. HTTP Status 404错误分析及解决方法
  5. 如何低成本挖掘App商店的免费资源
  6. 手写文字图片识别怎么弄?这几款软件安利快收好
  7. 抽取文本数据(TSV文件的抽取)
  8. 手撕系列-AdaBoost
  9. 解读《移动5G OpenUPF N4解耦设备规范》- 待更新
  10. RS232 DB9 计算机接口定义和RS232 (DB9) MAX232引脚定义