题意: 判断是不是强连通图 ,同时每一条边必须只能在一个环里

思路:之前我的强连通用的全是双深搜,结果题目的第二个要求很难判断,一开始写了三个深搜加上并查集,结果越写越乱,其实就是在判断一个边是否只在一个环内搞不定,后来看了下网上的代码,用的全是tarjan,没办法了,又学习了一下tarjan算法,学完后发现这个算法不错,比双深搜快一倍的时间吧,他的时间复杂度是O(n + m) n是点m是边,tarjan算法的运行步骤为第二问的解决提供了条件,其中的stack,low,dfn配合的很好,我们要开一个数组记录搜索路径,然后当我们搜到一个点发现他被搜过同时他还在stack中的话,我们直接通过路径数组原路返回到他,把路上所有的点的次数都加1(开个数组记录次数),如果发现有大于1的直接就NO了,还有就是点有一个点的次数不要加1,就是查找路径的第一个点的上一个点,也是路径中的最后一个点(因为是环),这样就ok了.

#include<stdio.h>

#include<string.h>

#include<stack>

                               

#define N_node 25000 + 1000

#define N_edge 55000 + 1000

using namespace std;

typedef struct

{

   int to ,next;

}STAR;

STAR E[N_edge];

int list[N_node] ,tot;

int mer[N_node];

int count[N_node];

int DFN[N_node] ,LOW[N_node];

int Index ,num ,okk;

int instack[N_node];

stack<int>st; 

void add(int a ,int b)

{

   E[++tot].to = b;

   E[tot].next = list[a];

   list[a] = tot;

}

int minn(int x ,int y)

{

   return x < y ? x : y;

}

void merge(int e ,int s)

{

   while(mer[s] != e)

   {

      count[s] ++;

      if(count[s] >= 2)

      {

         okk = 1;

         return ;

      }

      s = mer[s];

   }

}

void Tarjan(int s)

{

   if(okk) return;

   DFN[s] = LOW[s] =  Index ++;

   st.push(s);

   instack[s] = 1;

   for(int k = list[s] ;k ;k = E[k].next)

   {

      int to = E[k].to;

      if(!DFN[to])

      {

         mer[to] = s;

         Tarjan(to);

         LOW[s] = minn(LOW[to] ,LOW[s]);

      }

      else if(instack[to])

      {

         LOW[s] = minn(DFN[to] ,LOW[s]);

         merge(to ,s);

         if(okk) return;       

      }

   }

   if(LOW[s] == DFN[s])

   {

      num ++;

      if(num > 1) okk = 1;   

      while(1)

      {

         int v = st.top();

         st.pop();

         instack[v] = 0;

         if(v == s) break;

      }

   }

   return ;

}

 

int main ()

{

   int t ,i ,n ,a ,b;

   scanf("%d" ,&t);

   while(t--)

   {

      scanf("%d" ,&n);

      memset(list ,0 ,sizeof(list));

      memset(instack ,0 ,sizeof(instack));

      memset(DFN ,0 ,sizeof(DFN));

      memset(LOW ,0 ,sizeof(LOW));

      memset(count ,0 ,sizeof(count));

      for(i = 0 ;i < n ;i ++)mer[i] = i;

      while(!st.empty()) st.pop();

      tot = Index = 1 ,num = 0;

      while(scanf("%d %d" ,&a ,&b) && a + b)

      {

         add(a ,b);

      }

      okk = 0;

      for(i = 0 ;i < n ;i ++)

      {

         if(okk) break;

         if(DFN[i]) continue;

         Tarjan(i);

      }

      if(okk) printf("NO\n");

      else printf("YES\n");

   }

   return 0;

}

hdu3594 强连通 tarjan的更多相关文章

  1. POJ 1236 Network of Schools(强连通 Tarjan+缩点)

    POJ 1236 Network of Schools(强连通 Tarjan+缩点) ACM 题目地址:POJ 1236 题意:  给定一张有向图,问最少选择几个点能遍历全图,以及最少加入�几条边使得 ...

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

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

  3. HDOJ迷宫城堡(判断强连通 tarjan算法)

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

  4. 强连通tarjan模版

    #include<stdio.h> #include<iostream> #include<math.h> #include<queue> #inclu ...

  5. CF:Problem 427C - Checkposts强连通 Tarjan算法

    tarjan算法第一题 喷我一脸. ...把手写栈的类型开成了BOOL.一直在找错.. . #include<cstdio> #include<cstring> #includ ...

  6. 【算法•日更•第二十八期】图论:强连通+Tarjan算法(一)

    ▎前言 一直都想学习这个东西,以为很难,结果发现也不过如此. 只要会些图论的基础就可以了. ▎强连通 ☞『定义』 既然叫强连通,那么一定具有很强的连通性. 强连通:就是指在一个有向图中,两个顶点可以互 ...

  7. hdu1269迷宫城堡 (强连通Tarjan+邻接表)

    Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每一个通道都是单向的,就是说 ...

  8. HDU 2767 Proving Equivalences(强连通 Tarjan+缩点)

    Consider the following exercise, found in a generic linear algebra textbook. Let A be an n × n matri ...

  9. Tarjan找桥和割点与点连通分量与边连通分量【未成形】

    之前只学了个强连通Tarjan算法,然后又摸了缩点操作: 然后今天在lightoj摸了一道模板题,是求所有桥的题: 然后发现,要把:割点,割点集合,双连通,最小割边集合(桥),点连通分量,边连通分量都 ...

随机推荐

  1. 微信小程序3D轮播图

    <!-- 轮播图 --> <swiper previous-margin='50px' next-margin='50px' bindchange="swiperChang ...

  2. FreeBSD 入门导言

    →→→→→导言: 导言,这一部分通常也被称作"前言"."导论"."概论"."楔子"."写在前面".& ...

  3. 第三方API接口测试问题反馈文档

    大家在给甲方做大型项目的时候,有时候参与的厂商比较多,而公司负责的部分又需要第三方厂商提供接口支持. 例如我们做医疗行业的,给医院提供医保控费系统服务的,就需要HIS厂商提供接口给我们采集数据.有时候 ...

  4. 学员和教师管理优化用例点整理v2.0

    更新记录: 更新内容 更新人 更新时间 新建 Young 2021.01.08 12:06 彭洋洋确认结果疑问 Young 2021.01.08 15:06 问题集锦 1. 购买成功页点击完成返回路径 ...

  5. .Net Core 2.1 升级3.1 问题整理

    随着技术的不断拓展更新,我们所使用的技术也在不断地升级优化,项目的框架也在不断地升级,本次讲解 .net core 2.1  升级到3.1所需要注意的事项: 当项目框架升级后,所有的Nuget引用也会 ...

  6. P1725 琪露诺 题解(单调队列)

    题目链接 琪露诺 解题思路 单调队列优化的\(dp\). 状态转移方程:\(f[i]=max{f[i-l],f[i-l+1],...,f[i-r-1],f[i-r]}+a[i]\) 考虑单调队列优化. ...

  7. 计算异质性H值(运用arcgis和Python进行区域分析)

    最近需要对ecognition分割结果进行统计分析,以此来进一步判断其分割结果中的欠分割和过分割对象,在看了一篇论文后,发现了可以用一个参数H来判断每个切割对象的异质性,由于此方法需要用到arcgis ...

  8. css整理之-----------基本知识

    盒子模型 所有HTML元素可以看作盒子,它包括:边距,边框,填充,和实际内容. CSS中组成一个块级盒子需要: Content box: 这个区域是用来显示内容,大小可以通过设置 width 和 he ...

  9. 基于Docker的MindSpore安装与使用基础介绍

    技术背景 MindSpore是一款新一代AI开源计算框架,其特色在于:创新编程范式,AI科学家和工程师更易使用,便于开放式创新:该计算框架可满足终端.边缘计算.云全场景需求,能更好保护数据隐私:可开源 ...

  10. Codeforces Round #538 D. Lunar New Year and a Wander

    题面: 传送门 题目描述: Bob想在公园散步.公园由n个点和m条无向边组成.当Bob到一个未经过的点时,他就会把这个点的编号记录在笔记本上.当且仅当Bob走完所有的点,他才会停下来.这时,Bob的笔 ...