迷宫城堡

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 26892    Accepted Submission(s): 11446

Problem Description
为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。
 
Input
输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。
 
Output
对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。
 
Sample Input
3 3
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0
 
Sample Output
Yes
No
 
Author
Gardon
 
Source
 
Recommend
lxj   |   We have carefully selected several similar problems for you:  1233 1142 1217 1162 1102 

题解:求强连通分量,如果唯一则YES,否则为NO。模板题。
 
参考代码:
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. #define pii pair<int,int>
  5. #define pil pair<int,ll>
  6. #define fi head
  7. #define se second
  8. #define pb push_back
  9. #define mkp make_pair
  10. const int INF=0x3f3f3f3f;
  11. const ll inf=0x3f3f3f3f3f3f3f3fll;
  12. inline int read()
  13. {
  14. int x=,f=;char ch=getchar();
  15. while(ch<''||ch>''){if(ch=='-') f=-;ch=getchar();}
  16. while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
  17. return x*f;
  18. }
  19. const int maxn=;//点
  20. const int maxm=;//边
  21. struct Edge{
  22. int v,nxt;
  23. }edge[maxm];
  24. int head[maxn],Stack[maxn],dfn[maxn],low[maxn],Belong[maxm];
  25. int instack[maxn];
  26. int n,m,cnt,Blocks,top,tot;
  27. void Init()
  28. {
  29. cnt=;
  30. Blocks=top=tot=;//初始化连通分量标号,次序计数器,栈顶指针为0
  31. memset(head,-,sizeof(head));
  32. memset(dfn,,sizeof(dfn));
  33. }
  34. void AddEdge(int u,int v)
  35. {
  36. edge[tot].v=v;
  37. edge[tot].nxt=head[u];
  38. head[u]=tot++;
  39. }
  40. void Tarjan(int u)
  41. {
  42. int min,t;
  43. dfn[u]=low[u]=++tot; //cnt为时间戳
  44. instack[u]=; //标记在栈中
  45. Stack[top++]=u; //入栈
  46. for(int e=head[u];~e;e=edge[e].nxt)
  47. { //枚举v的每一条边
  48. int v=edge[e].v; //u所邻接的边
  49. if(!dfn[v])
  50. { //未被访问
  51. Tarjan(v); //继续向下找
  52. if(low[u]>low[v]) low[u]=low[v];//更新结点u所能到达的最小次数层
  53. }
  54. else if(instack[v]&&dfn[v]<low[u])//如果v结点在栈内
  55. low[u]=dfn[v];
  56. }
  57. if(dfn[u]==low[u])
  58. { //如果节点v是强连通分量的根
  59. Blocks++; //连通分量标号加1
  60. do
  61. {
  62. t=Stack[--top]; //退栈
  63. instack[t]=;//标记不在栈中
  64. Belong[t]=Blocks; //出栈结点t属于Blocks标号的强连通分量
  65. }while(t!=u); //直到将u从栈中退出
  66. }
  67. }
  68. void solve()
  69. {
  70. for(int i=;i<=n;++i)//枚举每个结点,搜索连通分量
  71. if(!dfn[i]) //未被访问
  72. Tarjan(i);//则找i结点的连通分量
  73. }
  74.  
  75. int main()
  76. {
  77. while(scanf("%d%d",&n,&m)&&(n||m))
  78. {
  79. Init();
  80. while(m--)
  81. {
  82. int u, v;
  83. u=read(); v=read();
  84. AddEdge(u,v);
  85. }
  86. solve();
  87. if(Blocks==) printf("Yes\n");
  88. else printf("No\n");
  89. }
  90. return ;
  91. }

HDU11269 迷宫城堡(强连通分量)的更多相关文章

  1. HDU1269 迷宫城堡 —— 强连通分量

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269 迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    M ...

  2. hdu 1269 迷宫城堡 强连通分量

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

  3. hdoj 1269 迷宫城堡(强连通分量)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269 思路分析:该问题要求判断是否每两个房间都可以相互到达,即求该有向图中的所有点是否只构成一个强连通 ...

  4. [SDOI2012]走迷宫 (强连通分量缩点,动态规划,高斯消元)

    题面 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发的 ...

  5. [hdu1269]城堡迷宫<tarjan强连通分量>

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269 tarjan算法是oi里很常用的一个算法,在理解方面需要多下一些功夫,如果不行直接记模板也行,因 ...

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

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

  7. hdu - 1269 迷宫城堡 (强连通裸题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1269 判断一个图是不是强连通,缩点之后判断顶点数是不是为1即可. #include <iostream&g ...

  8. HDU 1269 迷宫城堡(判断有向图强连通分量的个数,tarjan算法)

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

  9. HDU1269 迷宫城堡(裸强连通分量)

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

随机推荐

  1. kubernetes实战(二十八):Kubernetes一键式资源管理平台Ratel安装及使用

    1. Ratel是什么? Ratel是一个Kubernetes资源平台,基于管理Kubernetes的资源开发,可以管理Kubernetes的Deployment.DaemonSet.Stateful ...

  2. C++中对C的扩展学习新增内容———面向对象(封装)

    面向对象(封装) 1.对封装的理解: 1.封装就是把变量和函数放在一起统一表示某一个食物. class 2.给类内部的成员增加访问控制权限. 3.封装的语法就是class定义一个类. 2.给对象成员增 ...

  3. 系统信息命令(uname、dmesg、df、hostname、free)

    uname 显示计算机及操作系统相关的信息,uname -a显示全部信息,uname -r内核的发行号,各种信息可以有单独的选项分别指出 [lixn@Fedora24 ~]$ uname -a Lin ...

  4. ubuntu server 1604 关机和重启

    命令有很多,记住以下两三个就够了 重启: sudo reboot (这个短,易记) sudo shutdown -r now  统一的shutdown形式 关机:sudo shutdown -P no ...

  5. JavaWeb04-JSP及会话跟踪技术

    JSP入门 1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态资源.它与html页面的作用是相同的,显示数据和获取数据. 1.2 JSP的 ...

  6. [FPGA]浅谈LCD1602字符型液晶显示器(Verilog)

    目录 概述 LCD1602 LCD1602是什么? LCD1602的管脚 RS_数据/命令选择 E_使能 D0-D7 LCD1602有个DDRAM LCD1602还有个CGROM 指令集 清屏 进入模 ...

  7. AE安装部署以及监测ArcEngine runtime 9.3是否安装

    目的:用ArcEngine9.3开发项目以后,用Visual Studio2008打包工具打包: 同时监测别的机器上是否有ArcEngine Runtime或者Desktop的支持. 解决方案: 1. ...

  8. 线程中synchronized关键字和lock接口的异同

    一.synchronized关键字 1.可以用来修饰代码块 synchronized (this) { // 同步的关键字 this 表示当前线程对象 if (num == 0) { break; } ...

  9. Elasticsearch系列---全面了解Document

    概要 本篇主要介绍一下document的知识,对document的元数据和基本的语法进行讲解. document核心元数据 前面入门实战一节有简单介绍过document数据示例,这次我们来详细了解一下 ...

  10. 新闻实时分析系统-Flume+HBase+Kafka集成与开发

    1.下载Flume源码并导入Idea开发工具 1)将apache-flume-1.7.0-src.tar.gz源码下载到本地解压 2)通过idea导入flume源码 打开idea开发工具,选择File ...