HDU 3594 Cactus (强连通+仙人掌图)
<题目链接>
<转载于 >>> >
题目大意:
给你一个图,让你判断他是不是仙人掌图。
仙人掌图的条件是:
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 (强连通+仙人掌图)相关推荐
- 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,否则输 ...
- HDU 3594 Cactus(有向仙人掌图判断)
题目链接 题意 判断一个有向图是不是仙人掌图 思路 思路看这 代码看这 据说数据水,这个比较详细应该正确 tarjan 先判断图是否强连通 再判断是否为仙人掌 假设图强连通,结论如下 仙人掌图的 DF ...
- [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 首先,圆方树是比较好想到的,维护直径,我们最方便的做法就是先让它变成一棵树,这里因为是仙人掌图,所以就用圆方树来构建. 再者,就是维护直径了,比较好想到的是非环上结点,就 ...
最新文章
- 简单的聊聊自动化测试:Selenium的高级操作
- 企业 MySQL 优化实施方案
- 《江湖X:汉家江湖》游戏论剑系统技术全解析
- AUTOSAR从入门到精通100讲(四十九)-AUTOSAR 通信服务Dcm篇-Dcm概念及DSL详解与实战案例
- 利用zabbix web scenario 监控Web站点的可用性
- (65)SPI外设驱动用户接收模块(四)(第13天)
- php手机网站底部导航代码,jQuery微信手机端底部弹出导航菜单列表代码
- SQL Server学习之路(六):“增删改查”之“查”
- 使用navicat无法登陆oracle 数据库
- FusionGAN图像融合代码学习
- IDEA打包jar包及运行jar包命令
- 测试按键延迟软件,怎么测试键盘延迟-灵猫键盘DIY大师测试键盘响应速度的方法 - 河东软件园...
- gensim中word2vec API参数说明
- 德莱联盟(判断两点是否相交 nyist)
- micropython复现经典单片机项目(一)旋转立方块
- CAD如何调整线形比例?
- Elasticsearch 同义词配置
- 哪里可以下载Holer软件包
- WMS、WFS、WMTS、TMS
- 程序员小心,中了这4条,别人就很难和你沟通