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可以判强连通分量是否只有一个.然后对于所有边是否仅在一个环内,我 ...
随机推荐
- Java 银联支付官网demo测试及项目整合代码
注:原文来源与 < Java 银联支付官网demo测试及项目整合代码 > 银联支付(网关支付B2C) 一.测试官网demo a)下载官网开发包,导入eclipse等待修改(下载的开发包没 ...
- 基于DBUtils实现数据库连接池
小知识: 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_value,aggr): # Anim ...
- LeetCode(119):杨辉三角 II
Easy! 题目描述: 给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 3 输出: [1,3,3,1] 进阶: ...
- 安装lrzsz 实现windows与linux之间文件互传
环境:CentOS7.4 执行命令安装: [root@linuxhg01 www]# yum install lrzsz rz // Windows 上传到 linux [root@linuxhg01 ...
- Redis扩展
Redis扩展下载地址:https://windows.php.net/downloads/pecl/releases/redis/ PHP怎么安装redis扩展 http://www.php.cn/ ...
- add web server(nginx)
#!/bin/bash # # Web Server Install Script # Last Updated 2012.09.24 # ##### modify by WanJie 2012.09 ...
- mysql+redis+memcached
mysql+redis+memcached 数据库 数据库设计 a. 单表 b. FK(单表:一张表存储时,如果有重复出现的字段为了防止硬盘的浪费,所以做一个FK:去掉FK变成单表(这样子访问速度快了 ...
- Oracle unusable index 与unvisible index
1 可见性 索引的可见性(visibility)指的是该索引是否对CBO优化器可见,即CBO优化器在生成执行计划的时候是否考虑该索引,可以看作是索引的一个属性.如果一个索引可见性属性为:invisib ...
- 数据增强(每10度进行旋转,进行一次增强,然后对每张图片进行扩充10张patch,最后得到原始图片数*37*10数量的图片)
# -*- coding: utf-8 -*-"""Fourmi Editor This is a temporary script file.""& ...
- 饮冰三年-人工智能-Python-10之C#与Python的对比
1:注释 C# 中 单行注释:// 多行注释:/**/ python 中 单行注释:# 多行注释:“““内容””” 2:字符串 C#中 "" 用双引号如("我是字符串&q ...