<题目链接>

<转载于 >>> >

题目大意:

给你一个图,让你判断他是不是仙人掌图。

仙人掌图的条件是:

1、是强连通图。

2、每条边在仙人掌图中只属于一个强连通分量。仙人掌图pdf说明>>>

解题分析:

1、首先得先熟练掌握tarjan算法的应用。

2、必须了解仙人掌图的三个性质:

(1).仙人掌dfs图中不能有横向边,简单的理解为每个点只能出现在一个强联通分量中。

(2).low[v]<dfn[u],其中u为v的父节点

(3).a[u]+b[u]<2 ,  a[u]为u节点的儿子节点中有a[u]个low值小于u的dfn值。b[u]为u的逆向边条数。

三个性质有一个不满足则不是仙人掌图。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5
 6 #define rep(i,s,t) for(int i=s;i<=t;i++)
 7 #define clr(a,b) memset(a,b,sizeof(a))
 8 const int N = 2e4+10;
 9 const int M = 5e4+10;
10 int head[N],dfn[N],low[N],belong[N],stk[N];
11 bool color[N],instk[N],ok;
12 int n,top,tot,index,scnt;
13 struct Edge{
14     int to,next;
15 }edge[M];
16 void init(){
17     tot=top=index=scnt=0;
18     clr(head,-1);clr(dfn,0);clr(low,0);clr(belong,0);
19     clr(stk,0);clr(instk,false);clr(color,false);
20 }
21 void addedge(int u,int v){
22     edge[tot].to=v,edge[tot].next=head[u];
23     head[u]=tot++;
24 }
25 void Tarjan(int u){
26     dfn[u]=low[u]=++index;
27     stk[++top]=u,instk[u]=true;
28     int cnt=0;
29     for(int i=head[u];~i;i=edge[i].next){
30         int v = edge[i].to;
31         if(color[v])ok=false;   //性质1
32         if(!dfn[v]){
33             Tarjan(v);
34             if(low[v]>dfn[u])ok=false; //性质2
35             if(low[v]<dfn[u])cnt++;    //u的子节点中low值小于dfn[u]值得个数
36             if(cnt==2)ok=false;
37             low[u]=min(low[u],low[v]);
38         }else if(instk[v]){
39             low[u]=min(low[u],dfn[v]);cnt++;
40             if(cnt==2)ok=false;     //性质3
41         }
42     }
43     if(dfn[u]==low[u]){
44         scnt++;
45         while(true){
46             int v=stk[top--];
47             instk[v]=false;
48             belong[v]=scnt;
49             if(v==u)break;
50         }
51     }
52     color[u]=true;
53 }
54 int main(){
55     int T;scanf("%d",&T);while(T--){
56         scanf("%d",&n);
57         init();
58         int u,v;while(scanf("%d%d",&u,&v),u||v){
59             u++,v++;
60             addedge(u,v);
61         }
62         ok=true;
63         rep(i,1,n) if(!dfn[i]) {
64             Tarjan(i);
65         }
66         printf((scnt==1&&ok==true)?"YES\n":"NO\n");
67     }
68 }

2018-12-06

转载于:https://www.cnblogs.com/00isok/p/10080161.html

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. 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. bzoj 1023: [SHOI2008]cactus仙人掌图(仙人掌求直径)

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

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

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

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

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

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

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

最新文章

  1. 简单的聊聊自动化测试:Selenium的高级操作
  2. 企业 MySQL 优化实施方案
  3. 《江湖X:汉家江湖》游戏论剑系统技术全解析
  4. AUTOSAR从入门到精通100讲(四十九)-AUTOSAR 通信服务Dcm篇-Dcm概念及DSL详解与实战案例
  5. 利用zabbix web scenario 监控Web站点的可用性
  6. (65)SPI外设驱动用户接收模块(四)(第13天)
  7. php手机网站底部导航代码,jQuery微信手机端底部弹出导航菜单列表代码
  8. SQL Server学习之路(六):“增删改查”之“查”
  9. 使用navicat无法登陆oracle 数据库
  10. FusionGAN图像融合代码学习
  11. IDEA打包jar包及运行jar包命令
  12. 测试按键延迟软件,怎么测试键盘延迟-灵猫键盘DIY大师测试键盘响应速度的方法 - 河东软件园...
  13. gensim中word2vec API参数说明
  14. 德莱联盟(判断两点是否相交 nyist)
  15. micropython复现经典单片机项目(一)旋转立方块
  16. CAD如何调整线形比例?
  17. Elasticsearch 同义词配置
  18. 哪里可以下载Holer软件包
  19. WMS、WFS、WMTS、TMS
  20. 程序员小心,中了这4条,别人就很难和你沟通

热门文章

  1. python 爬虫爬取内容时, \xa0 、 \u3000 的含义与处理方法
  2. EMNLP'21 | 检索式对话情感回复
  3. 孙茂松教授——自然语言处理一瞥:知往鉴今瞻未来
  4. 天池NLP赛道top指南
  5. 【面经】字节AI Lab-NLP算法热乎面经
  6. 【论文串烧】基于特定实体的文本情感分类总结(PART I)
  7. 读书节第二日丨数据大咖来荐读,互动荐书赢好礼!
  8. 每周荐书:SQL优化、深度学习、数据科学家(评论送书)
  9. 收尾决胜武器:软文常用的9个收尾方法
  10. 免费讲座:网站运营之人性、策略与实战