迷宫城堡

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

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
  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<string>
  6. #include<string.h>
  7. using namespace std;
  8. const int maxx = ;
  9. int n,m;
  10. vector<int>g[maxx];
  11. vector<int>rg[maxx];
  12. vector<int>vs;
  13. bool vis[maxx];
  14. int cmp[maxx];
  15. void dfs(int v)
  16. {
  17. vis[v]=true;
  18. for(int i=;i<g[v].size();i++)
  19. {
  20. if(!vis[g[v][i]]) dfs(g[v][i]);
  21. }
  22. vs.push_back(v);
  23. }
  24. void rdfs(int v)
  25. {
  26. vis[v]=true;
  27. for(int i=;i<rg[v].size();i++)
  28. {
  29. if(!vis[rg[v][i]]) rdfs(rg[v][i]);
  30. }
  31. }
  32. int main()
  33. {
  34. while(scanf("%d%d",&n,&m)&&(n+m)!=)
  35. {
  36. for(int i=;i<=n;i++)
  37. {
  38. g[i].clear();
  39. rg[i].clear();
  40. }
  41. vs.clear();
  42. for(int i=;i<m;i++)
  43. {
  44. int tmp1,tmp2;
  45. scanf("%d%d",&tmp1,&tmp2);
  46. g[tmp1].push_back(tmp2);
  47. rg[tmp2].push_back(tmp1);
  48.  
  49. }
  50. memset(vis,,sizeof(vis));
  51. for(int i=;i<=n;i++)
  52. {
  53. if(!vis[i])
  54. {
  55. dfs(i);
  56. }
  57. }
  58. memset(vis,,sizeof(vis));
  59. int k=;
  60. for(int i=vs.size()-;i>-;i--)
  61. {
  62. if(!vis[vs[i]])
  63. {
  64. rdfs(vs[i]);
  65. k++;
  66. }
  67. }
  68. if(k==) printf("Yes\n");
  69. else printf("No\n");
  70. }
  71. return ;
  72. }

通过两次dfs,一次搜索原图,一次搜索其转置图,最后得到的k的值即图的强连通分支的个数。

这个算法非常神奇。证明我是不会的。但是看书从例子中可以显然的知道,这种方法是正确的。

hdu 1269 迷宫城堡 强连通分量的更多相关文章

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

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

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

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

  3. HDU 1269 迷宫城堡(强连通)

    HDU 1269 迷宫城堡 pid=1269" target="_blank" style="">题目链接 题意:中文题 思路:强连通模板题 代 ...

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

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

  5. hdu 1269 迷宫城堡

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1269 迷宫城堡 Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个 ...

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

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

  7. HDU 1269 迷宫城堡 (强连通分量,常规)

    题意: 判断所给的有向图是否是一个强连通图. 思路: 如果连通分量大于1则必定No,如果强连通分量大于1也是No.tarjan算法求强连通分量. #include <cstdio> #in ...

  8. HDU 1269 迷宫城堡 tarjan算法求强连通分量

    基础模板题,应用tarjan算法求有向图的强连通分量,tarjan在此处的实现方法为:使用栈储存已经访问过的点,当访问的点离开dfs的时候,判断这个点的low值是否等于它的出生日期dfn值,如果相等, ...

  9. HDU - 1269 迷宫城堡(有向图的强连通分量)

    d.看一个图是不是强连通图 s.求出强连通分量,看看有没有一个强连通分量包含所有点. c.Tarjan /* Tarjan算法 复杂度O(N+M) */ #include<iostream> ...

随机推荐

  1. 关于angularjs中的ng-class 变量问题

    时常会用到ng-class.非常的方便,基本的用法就是 当title等于通金所的时候,就增加error-tip这个class,但是,我们有时候这个值不能写死,明白我的意思吗,明白吗,好吧,反正就要是个 ...

  2. [Effective JavaScript 笔记]第15条:当心局部块函数声明笨拙的作用域

    嵌套函数声明.没有标准的方法在局部块里声明函数,但可以在另一个函数的顶部嵌套函数声明. function f(){return "global"} function test(x) ...

  3. 暑假热身 E. 无聊的LSY

    LSY大牛没事就爱玩游戏,包括很多很无聊的游戏.某日,LSY大牛又找到了一个无聊的游戏:每一局游戏的开始,LSY大牛将代表自己的棋子放在一个线性棋盘的最左端(第0个格子,可以认为向右端无限延伸),接着 ...

  4. HDU 1506 Largest Rectangle in a Histogram (dp左右处理边界的矩形问题)

    E - Largest Rectangle in a Histogram Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format: ...

  5. apache ab压力测试报错(apr_socket_recv: Connection reset by peer (104))

    apache ab压力测试报错(apr_socket_recv: Connection reset by peer (104))   今天用apache 自带的ab工具测试,当并发量达到1000多的时 ...

  6. vs2010 调试快捷键

    vs2010 调试快捷键   命令名 快捷键 说明 调试.应用代码更改 Alt + F10 启动生成操作,利用它可以通过“编辑并继续”功能应用对正在调试的代码所作的更改. 调试.自动窗口 Ctrl + ...

  7. sharepoint添加应用程序

  8. eclipse 启动后,啥也不干,就一直在loading descriptor for XXX (XXX为工程名),,其他什么操作都不能操作。 如下图所示,保存文件也无法保存。 这个怎么办?一年好几天,什么都干不了!!!!!

    解决办法: 解决办法是 断一下网就好了

  9. Java for LeetCode 070 Climbing Stairs

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  10. 3.python基础补充(集合,collection系列,深浅拷贝)

    一.集合 1.集合(set): 把不同的元素组成一起形成集合,是python基本的数据类型.集合元素(set elements):组成集合的成员 python的set和其他语言类似, 是一个无序不重复 ...