#include<stdio.h>
#include<string.h>
#define N 21000
struct node {
int v,next;
}bian[51000];
int yong,dfn[N],low[N],stac[N],top,index,visit[N],ans,flag,mark[N],head[N],pre[N];
void init() {//初始化
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(mark,0,sizeof(mark));
memset(visit,0,sizeof(visit));
memset(head,-1,sizeof(head));
memset(pre,0,sizeof(pre));
flag=0;yong=0;
index=0;top=0;ans=0;
memset(stac,0,sizeof(stac));
}
void addedge(int u,int v) {
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
int MIN(int a,int b) {
return a>b?b:a;
}
void judge(int v,int u) {//对于每一个强连通分量对边的两边的点增一
while(pre[u]!=v) {
mark[u]++;
if(mark[u]>1) {
flag=1;return ;
}
u=pre[u];
}
return ;
}
void tarjan(int u) {
dfn[u]=low[u]=++index;
stac[++top]=u;
visit[u]=1;
int i;
for(i=head[u];i!=-1;i=bian[i].next) {
int v=bian[i].v;
if(dfn[v]==0) {
pre[v]=u;
tarjan(v);
if(flag)
return ;
low[u]=MIN(low[u],low[v]);
}
else if(visit[v]) {
judge(v,u);
if(flag)return ;
low[u]=MIN(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]) {
ans++;
if(ans>1){//判断是否是一个强联通图
flag=1;return ;
}
int t;
do{
t=stac[top--];
visit[t]=0;
}while(t!=u);
}
return ;
}
int main() {
int t,n,a,b,i;
scanf("%d",&t);
while(t--) {
init();
scanf("%d",&n);
while(scanf("%d%d",&a,&b),a||b) {
addedge(a,b);
}
for(i=0;i<n;i++) {
if(!dfn[i])
tarjan(i);
if(flag)break;
}
if(flag==0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}

hdu 3594 强连通好题仙人掌图,对自己的tarjan模板改下用这个的更多相关文章

  1. hdu 3594 Cactus /uva 10510 仙人掌图判定

    仙人掌图(有向):同时满足:1强连通:2任何边不在俩个环中. 个人理解:其实就是环之间相连,两两只有一个公共点,(其实可以缩块),那个公共点是割点.HDU数据弱,网上很多错误代码和解法也可以过. 个人 ...

  2. HDU 3594 Cactus 有向仙人掌图判定

    题意 给出一个有向图,并给出仙人掌图的定义 图本身是强连通的 每条边属于且只属于一个环 判断输入的图是否是强连通的. 分析 杭电OJ上的数据比较弱,网上一些有明显错误的代码也能AC. 本着求真务实的精 ...

  3. HDU 3594 Cactus (强连通+仙人掌图)

    <题目链接> <转载于 >>> > 题目大意: 给你一个图,让你判断他是不是仙人掌图. 仙人掌图的条件是: 1.是强连通图. 2.每条边在仙人掌图中只属于一个 ...

  4. HDU 3594.Cactus 仙人掌图

    Cactus Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  5. hdu3594 强连通(仙人掌图)

    题意:给定一张有向图,问是否是仙人掌图.仙人掌图的定义是,首先,这张图是一个强连通分量,其次所有边在且仅在一个环内. 首先,tarjan可以判强连通分量是否只有一个.然后对于所有边是否仅在一个环内,我 ...

  6. HDU 6041.I Curse Myself 无向仙人掌图

    I Curse Myself Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  7. HDU 6041 I Curse Myself ——(仙人掌图,tarjan,转化)

    题解见这个博客:http://blog.csdn.net/ME495/article/details/76165039. 复杂度不太会算..这个经典问题的解法需要注意,维护队列里面只有k个元素即可.另 ...

  8. bzoj千题计划113:bzoj1023: [SHOI2008]cactus仙人掌图

    http://www.lydsy.com/JudgeOnline/problem.php?id=1023 dp[x] 表示以x为端点的最长链 子节点与x不在同一个环上,那就是两条最长半链长度 子节点与 ...

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

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

随机推荐

  1. spring拦截器和注解处理日志操作

    整体思想:通过拦截器拦截所有的请求,处理含有自定义注解的方法,通过request得到需要的参数. 拦截器代码: package com.zktx.platform.log2; import java. ...

  2. linux patch 命令小结【转】

    本文转载自:http://blog.csdn.net/wh_19910525/article/details/7515540 说到patch命令,就不得不提到diff命令,也就是制作patch的必要工 ...

  3. 逻辑回归 C++

    #include <iostream>#include <string>#include <fstream>#include <sstream>#inc ...

  4. 98.Ext.form.Label组件的基本用法

    转自:https://www.cnblogs.com/kelly/archive/2009/06/05/1496897.html 本篇介绍Ext.form.Label组件的基本用法: 这里通过上一篇介 ...

  5. 最新昆石VOS2009/VOS3000手机号段导入文件(手机归属地)

    使用2017年4月最新版手机号段归属地制作,支持所有版本的VOS 共360569条记录,兼容所有版本的昆石VOS,包括VOS2009.vos3000.vos5000 导入比较简单.下载后解压到桌面在V ...

  6. 关于类和对象的进一步讨论之析构函数 C++

    析构函数也是一个特殊的成员函数.它的作用与构造函数相反.它的名字是在类名的前面加一个“~”符号.在C++中“~”是位取反运算符.当对象的生命结束时,会自动执行解析函数.以下几种情况会执行析构函数: 1 ...

  7. Element-UI 笔记

    1.表单验证 官官方地址 :     https://element.eleme.cn/#/zh-CN/component/form 使用rules进行表单字段验证  https://blog.csd ...

  8. 【NOI1999、LOJ#10019】生日蛋糕(搜索、最优化剪枝、可行性剪枝)

    主要是剪枝的问题,见代码,讲的很详细 #include<iostream> #include<cstdio> #include<cmath> #include< ...

  9. CALayer帧动画

    CALayer帧动画 _sunLayer = [[CALayer alloc]init]; _sunLayer.contents = (id)[UIImage imageNamed:@"su ...

  10. B - Double Cola

    Problem description Sheldon, Leonard, Penny, Rajesh and Howard are in the queue for a "Double C ...