1     /*          题意: 给你一个图,求这个有向图示否是一个强连通图(每两个节点都是可以相互到达的)!          思路1:按正向边dfs一遍,将经过的节点计数,如果记录的节点的个数小于n,那么就说明图按照正向边就不是连同的,所以就不是强连通图!                然后按照反向边再进行另一个dfs,同样对经过的节点的个数进行计数,如果个数==n则说明正向遍历和反响遍历都是连通的!那么整个图就是强连通的图!

          思路2:直接套用tarjan算法,求出每一个节点所对应的缩点的值, 如果缩点的个数==1,那么证明就会只有一个强连通分量!也就是强连通图

          思路3:多次次调用tarjan算法,判断low[u]==pre[u]&&u==1, 如果不满足说明改图有多个缩点,那就不是强连通图!下图说明一下....


     */  //思路一:  2 #include<iostream>
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<algorithm>
  6 #include<vector>
  7 #define N 10005
  8 using namespace std;
  9
 10 vector<int>uv[N];
 11 vector<int>vu[N];
 12
 13 int vis[N];
 14
 15 int cnt;
 16
 17 int n, m;
 18
 19 void dfs1(int u){
 20     vis[u]=1;
 21     ++cnt;
 22     int len=uv[u].size();
 23     for(int i=0; i<len; ++i){
 24         int v=uv[u][i];
 25         if(!vis[v])
 26            dfs1(v);
 27     }
 28 }
 29
 30
 31 void dfs2(int v){
 32     vis[v]=1;
 33     ++cnt;
 34     int len=vu[v].size();
 35     for(int i=0; i<len; ++i){
 36         int u=vu[v][i];
 37         if(!vis[u])
 38            dfs2(u);
 39     }
 40 }
 41
 42 int main(){
 43    while( scanf("%d%d", &n, &m) && (n||m) ){
 44        memset(vis, 0, sizeof(vis));
 45        for(int i=1; i<=n; ++i){
 46            uv[i].clear();
 47            vu[i].clear();
 48        }
 49        while(m--){
 50            int u, v;
 51            scanf("%d%d", &u, &v);
 52            uv[u].push_back(v);
 53            vu[v].push_back(u);
 54        }
 55        cnt=0;
 56        dfs1(1);
 57
 58        if(cnt==n){
 59           memset(vis, 0, sizeof(vis));
 60           cnt=0;
 61           dfs2(1);
 62           if(cnt!=n)
 63              printf("No\n");
 64           else printf("Yes\n");
 65        }
 66        else printf("No\n");
 67
 68    }
 69    return 0;
 70 }
 71
 //思路二: #include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<vector>#include<stack>#define N 10005using namespace std;vector<int>g[N];stack<int>s; int pre[N], low[N];int scc[N];int scc_cnt;int dfs_clock;void tarjans(int u){pre[u]=low[u]=++dfs_clock;s.push(u);int len=g[u].size();for(int i=0; i<len; ++i){int v=g[u][i];if(pre[u]>pre[v]){if(!pre[v]){tarjans(v);low[u]=min(low[v], low[u]); }elselow[u]=min(pre[v], low[u]);}        }if(low[u]==pre[u]){++scc_cnt;while(1){int x=s.top();s.pop();scc[x]=scc_cnt;if(x==u) break;}}}int n, m;int main(){while(scanf("%d%d", &n, &m) && (n||m)){while(m--){int u, v;scanf("%d%d", &u, &v);g[u].push_back(v);       }                    dfs_clock=0;scc_cnt=0;for(int i=1; i<=n; ++i)if(!scc[i])tarjans(i);int i;for(i=2; i<=n; ++i)if(scc[i]!=scc[1]){printf("No\n");break;}if(i>n)   printf("Yes\n");memset(pre, 0, sizeof(pre));memset(low, 0, sizeof(low));memset(scc, 0, sizeof(scc));for(i=1; i<=n; ++i)g[i].clear();}return 0;
}
 //思路三: 1  #include<iostream>
 2  #include<cstring>
 3  #include<cstdio>
 4  #include<algorithm>
 5  #include<vector>
 6  #define N 10005
 7  using namespace std;
 8
 9  vector<int>g[N];
10  bool flag;
11  int pre[N], low[N];
12  int dfs_clock;
13
14  void tarjans(int u){
15      pre[u]=low[u]=++dfs_clock;
16      int len=g[u].size();
17      for(int i=0; i<len; ++i){
18         int v=g[u][i];
19         if(!flag) return ;
20         if(pre[u]>pre[v]){
21             if(!pre[v]){
22                 tarjans(v);
23                 low[u]=min(low[v], low[u]);
24              }
25             else
26                 low[u]=min(pre[v], low[u]);
27          }
28      }
29
30      if(low[u]==pre[u] && u!=1)
31          flag=false;
32  }
33
34  int n, m;
35  int main(){
36      while(scanf("%d%d", &n, &m) && (n||m)){
37          while(m--){
38             int u, v;
39             scanf("%d%d", &u, &v);
40             g[u].push_back(v);
41          }
42          dfs_clock=0;
43          flag=true;
44          for(int i=1; i<=n; ++i)
45            if(!pre[i]){
46               if(!flag) break;
47               tarjans(i);
48            }
49
50          if(!flag)  printf("No\n");
51          else       printf("Yes\n");
52          memset(pre, 0, sizeof(pre));
53          memset(low, 0, sizeof(low));
54          for(int i=1; i<=n; ++i)
55             g[i].clear();
56      }
57      return 0;
58 }
59  

转载于:https://www.cnblogs.com/hujunzheng/p/3928056.html

hdu1269迷宫城堡(判断有向图是否是一个强连通图)相关推荐

  1. HDU1269 迷宫城堡(模板题)

    HDU1269 迷宫城堡 文章目录 Problem Description 题解: Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N< ...

  2. [hdu1269]迷宫城堡(SCC)

    题意:求一张图的强连通分量,若为1,则输出yes,否则输出no. 解题关键:targin算法模板题. 1 #include<iostream> 2 #include<cstring& ...

  3. 【HDU - 1269】迷宫城堡 (tarjan算法模板)

    题干: 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只 ...

  4. HDU 1269 迷宫城堡 -- 强连通图判断

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1269 图的强连通分量 http://baike.baidu.com/link?url=NqsmNsGC ...

  5. HDU 1269 迷宫城堡(强连通图的判定)

    最近<算法导论>快看完图论部分了,很多有关图的算法都彻底搞懂并加以证明了.现在主要是将理解的思想用到题目中来加强下.这个题目主要是判断一下整个图是否是强连通的,很简单,可以用tarjan也 ...

  6. 算法提高课-图论-欧拉回路和欧拉路径-AcWing 1185. 单词游戏:判断有向图是否存在欧拉路径、并查集

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 把每个单词看成一条边!!!首字母到尾字母的一条边,最多共有26个点(26个小写的英文字母),然后问能否把所有边串起来. 其实,对欧拉 ...

  7. 【HDU 1269】迷宫城堡 (Tarjan算法)

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  8. 两种方法判断有向图是否有环【DFS】【拓扑排序】

    方法1:DFS判断有向图是否有环 对一个节点u进行DFS,判断是否能从u回到自己这个节点,即是否存在u到u的回路. color数组代表每个节点的状态 -1代表还没访问,0代表正在被访问,1代表访问结束 ...

  9. DFS应用——遍历有向图+判断有向图是否有圈

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "DFS应用--遍历有向图+判断有向图是否有圈" 的idea 并用源代码加以实现 : ...

最新文章

  1. miniui列表下拉允许编辑且保存_办公小技巧:请个好用的文本代码编辑器
  2. C# 虚函数和重载函数
  3. dataframe的重设index
  4. Debug 之 VS2010网站生成成功,但是发布失败
  5. 装windows和Linux系统时找不到硬盘,pe安装系统没有出现磁盘,不能识别磁盘
  6. SQL强化(二) 在Oracle 中写代码
  7. 小米盗图迪丽热巴?公关经理:占位示意 不存在故意盗图!
  8. android零基础教程,Android零基础入门|Activity初入门,创建和配置如此简单
  9. Linux网络嗅探器实验报告,C语言实现 Linux 网络嗅探器
  10. RS485设计技巧TOP10
  11. 癌症/肿瘤免疫治疗最新进展(2022年3月)
  12. finecms基础操作
  13. 嵌入式技术可以做哪些产品
  14. 2023 Archlinux NVIDIA 3070 intel 双显卡驱动 + i3wm 解决方案
  15. csv文件示例_自己动手? -一个简单的CSV解析器示例
  16. Android源码配置第三方应用电池白名单流程分析笔记
  17. 全网最新 java 开发 OPC 实现 DA 通讯控制点位 西门子
  18. 【pytest-html】深度探索pytest-html测试报告的自定义使用
  19. (14)python函数与变量
  20. 融易宝项目管理平台前台搭建

热门文章

  1. 请写一个java程序实现线程连接池功能_写一个java程序实现线程连接池的功能
  2. python运行空白_执行时空白tkinter窗口
  3. c语言队列作用,队列(C语言)
  4. c++如何禁用指定的键盘布局_Karabiner Elements for Mac 键盘键位自定义改键工具
  5. oracle11g linux 日期格式设置
  6. ant压缩和解压缩工具类
  7. gblfy大数据技术之安装CentOS系列
  8. 【Java】数据结构——栈(图文)
  9. java shareable_spring中@Resource和@Autowired理解详解_编程语言_IT虾米网
  10. UDP丢包问题及解决方案