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的逆向边条数。
三个性质有一个不满足则不是仙人掌图。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++)
#define clr(a,b) memset(a,b,sizeof(a))
const int N = 2e4+;
const int M = 5e4+;
int head[N],dfn[N],low[N],belong[N],stk[N];
bool color[N],instk[N],ok;
int n,top,tot,index,scnt;
struct Edge{
int to,next;
}edge[M];
void init(){
tot=top=index=scnt=;
clr(head,-);clr(dfn,);clr(low,);clr(belong,);
clr(stk,);clr(instk,false);clr(color,false);
}
void addedge(int u,int v){
edge[tot].to=v,edge[tot].next=head[u];
head[u]=tot++;
}
void Tarjan(int u){
dfn[u]=low[u]=++index;
stk[++top]=u,instk[u]=true;
int cnt=;
for(int i=head[u];~i;i=edge[i].next){
int v = edge[i].to;
if(color[v])ok=false; //性质1
if(!dfn[v]){
Tarjan(v);
if(low[v]>dfn[u])ok=false; //性质2
if(low[v]<dfn[u])cnt++; //u的子节点中low值小于dfn[u]值得个数
if(cnt==)ok=false;
low[u]=min(low[u],low[v]);
}else if(instk[v]){
low[u]=min(low[u],dfn[v]);cnt++;
if(cnt==)ok=false; //性质3
}
}
if(dfn[u]==low[u]){
scnt++;
while(true){
int v=stk[top--];
instk[v]=false;
belong[v]=scnt;
if(v==u)break;
}
}
color[u]=true;
}
int main(){
int T;scanf("%d",&T);while(T--){
scanf("%d",&n);
init();
int u,v;while(scanf("%d%d",&u,&v),u||v){
u++,v++;
addedge(u,v);
}
ok=true;
rep(i,,n) if(!dfn[i]) {
Tarjan(i);
}
printf((scnt==&&ok==true)?"YES\n":"NO\n");
}
}
2018-12-06
HDU 3594 Cactus (强连通+仙人掌图)的更多相关文章
- hdu - 3594 Cactus (强连通)
http://acm.hdu.edu.cn/showproblem.php?pid=3594 判断给定的图是否是强连通的,并且每条边都只属于一个连通分量. 判断强连通只需要判断缩点之后顶点数是否为1即 ...
- HDU 3594 Cactus(仙人掌问题)
http://acm.hdu.edu.cn/showproblem.php?pid=3594 题意: 一个有向图,判断是否强连通和每条边只在一个环中. 思路: 仙人掌问题. 用Tarjan算法判断强连 ...
- HDU 3594.Cactus 仙人掌图
Cactus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu 3594 Cactus /uva 10510 仙人掌图判定
仙人掌图(有向):同时满足:1强连通:2任何边不在俩个环中. 个人理解:其实就是环之间相连,两两只有一个公共点,(其实可以缩块),那个公共点是割点.HDU数据弱,网上很多错误代码和解法也可以过. 个人 ...
- HDU 3594 Cactus 有向仙人掌图判定
题意 给出一个有向图,并给出仙人掌图的定义 图本身是强连通的 每条边属于且只属于一个环 判断输入的图是否是强连通的. 分析 杭电OJ上的数据比较弱,网上一些有明显错误的代码也能AC. 本着求真务实的精 ...
- HDU 3594 Cactus (强连通分量 + 一个边只能在一个环里)
题意:判断题目中给出的图是否符合两个条件.1 这图只有一个强连通分量 2 一条边只能出现在一个环里. 思路:条件1的满足只需要tarjan算法正常求强连通分量即可,关键是第二个条件,我们把对边的判断转 ...
- HDU - 3594 Cactus
这是一个有向仙人掌的题目,要求判定给定的图是不是强连通图,而且每一条边只能出现在一个环中,这里有一个介绍有向仙人掌的文档:http://files.cnblogs.com/ambition/cactu ...
- 仙人掌图判定及求直径HDU3594 BZOJ1023
https://wenku.baidu.com/view/ce296043192e45361066f575.html //仙人掌图基础知识3个判定条件 http://blog.csdn.net/y ...
- hdu3594 强连通(仙人掌图)
题意:给定一张有向图,问是否是仙人掌图.仙人掌图的定义是,首先,这张图是一个强连通分量,其次所有边在且仅在一个环内. 首先,tarjan可以判强连通分量是否只有一个.然后对于所有边是否仅在一个环内,我 ...
随机推荐
- Socket通讯成功案例
Socket通讯案例 #region 服务端 //int port = 1234; //string host = "127.0.0.1"; //IPAddress ip = IP ...
- Confluence 6 安装 SQL Server
如果你还没有在安装可以连接的 Microsoft SQL Server 数据库,请先下载后进行安装.请参考 MSDN 上 Installation for SQL Server 的指南. 有关授权模 ...
- Vue.js结合vue-router和webpack编写单页路由项目
一.前提 1. 安装了node.js. 2. 安装了npm. 3. 检查是否安装成功: 打开cmd,输入node,没有报“node不是内部或外部命令”表示安装成功node.js. 打开cmd,输入np ...
- nginx之请求限制与连接限制
模块limit_conn_module与limit_req_module limit_conn_module语法 limit_req_module语法 附: http长连接与短连接
- react native 打包Ignoring return value of function declared with warn_unused_result attribute
从 github上下载 项目 用于学习查看别人的代码, 当执行完npm install 用xcode 打开 发现俩个错误提示Ignoring return value of function dec ...
- 声明寄存器ROM
:] ROM [:] ; integer i; initial begin ;i<=;i=i+) begin ROM[i] <= {{'b0}}; end end 同时可以考虑双端口ROM ...
- cf1144G 将串分解成单调递增和递减子串(贪心)
这算哪门子dp.. 具体做法就是贪心,建立两个vector存递增序列递减序列,操作过程中a可以合法地匀一个给b 就是判断第i个数放在递增序列里还是放在递减序列里,需要根据后面的数来进行决策 #incl ...
- bitset用法详解
参见此博客: https://www.cnblogs.com/magisk/p/8809922.html
- Nginx详解十三:Nginx场景实践篇之防盗链
防盗链: 目的:防止资源被盗用 防盗链设置思路 首要方式:区别哪些请求是非正常的用户请求 基于http_refer防盗链配置模块(判断refer(上一步的链接)信息是否为允许访问的网站) 配置语法:v ...
- mysql一列相同另一列相加
select name, sum(number) total from test group by name;