#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. Framebuffer 机制【转】

    本文转载自:http://blog.csdn.net/paul_liao/article/details/7706477 Framebuffer Framebuffer是Linux系统为显示设备提供的 ...

  2. pass an instance of class to TestCase as parameter

    use testcasesource instead https://stackoverflow.com/questions/4220943/how-to-pass-dynamic-objects-i ...

  3. bzoj2595 [Wc2008]游览计划——斯坦纳树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2595 今天刚学了斯坦纳树,还不太会,写一道题练习一下: 参考了博客:http://www.c ...

  4. 新建项目git clone

  5. Cloudera Manager安装之利用parcels方式(在线或离线)安装单节点集群(包含最新稳定版本或指定版本的安装)(添加服务)(Ubuntu14.04)(四)

    .. 欢迎大家,加入我的微信公众号:大数据躺过的坑     免费给分享       同时,大家可以关注我的个人博客:  http://www.cnblogs.com/zlslch/   和  http ...

  6. C#:使用FastReport打印带图片传参模板的实现方法

    大家都知道,C#打印图片可以直接调用PrintDocument控件的PrintPage事件,通过画刷对image对象直接进行绘制.但是这种方法存在局限,例如如果打印的图片需要按纸张大小进行缩放的话,那 ...

  7. https 结合使用 对称加密和非对称加密

    (一)对称加密(Symmetric Cryptography) ---共享密钥加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥( ...

  8. Android Fragment间的广播消息接收

    这种方式不用在配置文件加东西,我比较喜欢. 广播注册,可以写在Activity(onCreate),也可以写在Fragment(onActivityCreated)里. LocalBroadcastM ...

  9. 去除DialogFragment的背景阴影,背景色,标题栏

    style中: <resources xmlns:android="http://schemas.android.com/apk/res/android"> <s ...

  10. dell inspiron 15 3000 装XP win7 等GHOST系统方法

    dell inspiron 装XP win7 等GHOST系统方法 . 开机按F2,进入BIOS .在 BIOS 的Boot菜单下,将Secure Boot 改为 Disabled . 将Boot L ...