1. #include<stdio.h>
  2. #include<string.h>
  3. #define N 21000
  4. struct node {
  5. int v,next;
  6. }bian[51000];
  7. int yong,dfn[N],low[N],stac[N],top,index,visit[N],ans,flag,mark[N],head[N],pre[N];
  8. void init() {//初始化
  9. memset(dfn,0,sizeof(dfn));
  10. memset(low,0,sizeof(low));
  11. memset(mark,0,sizeof(mark));
  12. memset(visit,0,sizeof(visit));
  13. memset(head,-1,sizeof(head));
  14. memset(pre,0,sizeof(pre));
  15. flag=0;yong=0;
  16. index=0;top=0;ans=0;
  17. memset(stac,0,sizeof(stac));
  18. }
  19. void addedge(int u,int v) {
  20. bian[yong].v=v;
  21. bian[yong].next=head[u];
  22. head[u]=yong++;
  23. }
  24. int MIN(int a,int b) {
  25. return a>b?b:a;
  26. }
  27. void judge(int v,int u) {//对于每一个强连通分量对边的两边的点增一
  28. while(pre[u]!=v) {
  29. mark[u]++;
  30. if(mark[u]>1) {
  31. flag=1;return ;
  32. }
  33. u=pre[u];
  34. }
  35. return ;
  36. }
  37. void tarjan(int u) {
  38. dfn[u]=low[u]=++index;
  39. stac[++top]=u;
  40. visit[u]=1;
  41. int i;
  42. for(i=head[u];i!=-1;i=bian[i].next) {
  43. int v=bian[i].v;
  44. if(dfn[v]==0) {
  45. pre[v]=u;
  46. tarjan(v);
  47. if(flag)
  48. return ;
  49. low[u]=MIN(low[u],low[v]);
  50. }
  51. else if(visit[v]) {
  52. judge(v,u);
  53. if(flag)return ;
  54. low[u]=MIN(low[u],dfn[v]);
  55. }
  56. }
  57. if(dfn[u]==low[u]) {
  58. ans++;
  59. if(ans>1){//判断是否是一个强联通图
  60. flag=1;return ;
  61. }
  62. int t;
  63. do{
  64. t=stac[top--];
  65. visit[t]=0;
  66. }while(t!=u);
  67. }
  68. return ;
  69. }
  70. int main() {
  71. int t,n,a,b,i;
  72. scanf("%d",&t);
  73. while(t--) {
  74. init();
  75. scanf("%d",&n);
  76. while(scanf("%d%d",&a,&b),a||b) {
  77. addedge(a,b);
  78. }
  79. for(i=0;i<n;i++) {
  80. if(!dfn[i])
  81. tarjan(i);
  82. if(flag)break;
  83. }
  84. if(flag==0)
  85. printf("YES\n");
  86. else
  87. printf("NO\n");
  88. }
  89. return 0;
  90. }

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. C++重载运算符简单总结

    当运算符作用于类类型的运算对象时,可以通过运算符重载重新定义该运算符的含义.明智的使用运算符重载能令我们的程序更易于编写和阅读. 一.基本概念 什么是运算符重载?重载的运算符是具有特殊名字的函数:它们 ...

  2. Android EditText技巧总结

    一.默认不获取焦点: 在布局文件的父控件中,设置如下属性: android:focusable="true" android:focusableInTouchMode=" ...

  3. hihocoder 1676 树上等差数列 黑科技树形dp

    #1676 : 树上的等差数列 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一棵包含N个节点的无根树,节点编号1~N.其中每个节点都具有一个权值,第i个节点的权值 ...

  4. B3109 [cqoi2013]新数独 搜索dfs

    就是基于普通数独上的一点变形,然后就没什么了,普通数独就是进行一边dfs就行了. 题干: 题目描述 输入格式 输入一共15行,包含一个新数独的实例.第奇数行包含左右方向的符号(<和>),第 ...

  5. 复习--二叉树&&树

    树是一种很常用的数据结构,日后的学习中会经常碰到运用树的知识. //构造二叉树#include<cstdio> #include<iostream> #include<a ...

  6. java 分布式锁

    转自:http://www.hollischuang.com/archives/1716 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题.分布式的CA ...

  7. Shuffle'm Up(串)

    http://poj.org/problem?id=3087 题意:每组3个串,前两个串长度为n,第三个串长度为2*n,依次从第二个串(s2)中取一个字符,从第一个串(s1)中取一个字符,...... ...

  8. JS中对象按属性排序(冒泡排序)

    在实际工作经常会出现这样一个问题:后台返回一个数组中有i个json数据,需要我们根据json中某一项进行数组的排序. 例如返回的数据结构大概是这样: { result:[ {id:,name:'中国银 ...

  9. Java多线程-synchronized关键字

    进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元.线程在控制着进程的执行. 一个进程中至少有一个线程 Ja ...

  10. Android学习——数据存储之文件存储

    将数据存储到文件中并读取数据 1.新建FilePersistenceTest项目,并修改activity_main.xml中的代码,如下:(只加入了EditText,用于输入文本内容,不管输入什么按下 ...