迷宫城堡

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

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
有向图缩点模板题
模板1:kosaraju
  1. #include"cstdio"
  2. #include"cstring"
  3. #include"vector"
  4. using namespace std;
  5. const int MAXN=;
  6. vector<int> G[MAXN];
  7. vector<int> rG[MAXN];
  8. vector<int> vs;
  9. int V,E;
  10. int vis[MAXN];
  11. inline int max(int a,int b)
  12. {
  13. return a > b? a: b;
  14. }
  15. void dfs(int u)
  16. {
  17. vis[u]=;
  18. for(int i=;i<G[u].size();i++)
  19. if(!vis[G[u][i]]) dfs(G[u][i]);
  20. vs.push_back(u);
  21. }
  22. void rdfs(int u)
  23. {
  24. vis[u]=;
  25. for(int i=;i<rG[u].size();i++)
  26. if(!vis[rG[u][i]]) rdfs(rG[u][i]);
  27. }
  28. bool scc()
  29. {
  30. memset(vis,,sizeof(vis));
  31. for(int i=;i<=V;i++)
  32. if(!vis[i]) dfs(i);
  33. memset(vis,,sizeof(vis));
  34. int k=;
  35. for(int i=vs.size()-;i>=;i--)
  36. if(!vis[vs[i]])
  37. {
  38. rdfs(vs[i]);
  39. k++;
  40. if(k>) return false;
  41. }
  42. return true;
  43. }
  44. int main()
  45. {
  46. while(scanf("%d%d",&V,&E)!=EOF&&V)
  47. {
  48. vs.clear();
  49. for(int i=;i<=V;i++)
  50. {
  51. G[i].clear();
  52. rG[i].clear();
  53. }
  54. for(int i=;i<E;i++)
  55. {
  56. int u,v;
  57. scanf("%d%d",&u,&v);
  58. G[u].push_back(v);
  59. rG[v].push_back(u);
  60. }
  61.  
  62. if(scc())
  63. {
  64. printf("Yes\n");
  65. }
  66. else
  67. {
  68. printf("No\n");
  69. }
  70. }
  71.  
  72. return ;
  73. }

模板2:tarjan

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<vector>
  5. using namespace std;
  6. const int MAXN=;
  7. vector<int> mp[MAXN];
  8. int n,m;
  9. int dfn[MAXN],low[MAXN],time;
  10. int stack[MAXN],top;
  11. bool ins[MAXN];
  12. int cnt=;
  13. void tarjan(int u)
  14. {
  15. dfn[u]=low[u]=++time;
  16. stack[top++]=u;
  17. ins[u]=true;
  18. for(int i=;i<mp[u].size();i++)
  19. {
  20. int v=mp[u][i];
  21. if(!dfn[v])
  22. {
  23. tarjan(v);
  24. low[u]=min(low[u],low[v]);
  25. }
  26. else if(ins[v]) low[u]=min(low[u],dfn[v]);
  27. }
  28. if(dfn[u]==low[u])
  29. {
  30. int v;
  31. cnt++;
  32. do{
  33. v=stack[--top];
  34. ins[v]=false;
  35. }while(u!=v);
  36. }
  37. }
  38. int main()
  39. {
  40. while(scanf("%d%d",&n,&m)!=EOF)
  41. {
  42. if(n==&&m==)
  43. break;
  44. memset(dfn,,sizeof(dfn));
  45. memset(low,,sizeof(low));
  46. memset(ins,false,sizeof(ins));
  47. time=;
  48. top=;
  49. cnt=;
  50. for(int i=;i<=n;i++)
  51. mp[i].clear();
  52. for(int i=;i<m;i++)
  53. {
  54. int u,v;
  55. scanf("%d%d",&u,&v);
  56. mp[u].push_back(v);
  57. }
  58.  
  59. for(int i=;i<=n;i++)
  60. {
  61. if(!dfn[i])
  62. {
  63. tarjan(i);
  64. }
  65. }
  66.  
  67. if(cnt==)
  68. printf("Yes\n");
  69. else
  70. printf("No\n");
  71. }
  72. }

该题目也可用并查集做。

  1. #include"cstdio"
  2. #include"cstring"
  3. using namespace std;
  4. const int MAXN=;
  5. int V,E;
  6. int par[][MAXN];//par[0][MAXN]记录正向边,par[1][MAXN]记录反向边
  7. int fnd(int x,int type)
  8. {
  9. if(par[type][x]==x)
  10. {
  11. return x;
  12. }
  13. return par[type][x]=fnd(par[type][x],type);
  14. }
  15. void unite(int x,int y)
  16. {
  17. if(x>) par[][x]=fnd(y,);//将结点1作为根结点
  18. if(y>) par[][y]=fnd(x,);
  19. }
  20. bool judge()
  21. {
  22. for(int i=;i<=V;i++)
  23. if(fnd(i,)!=||fnd(i,)!=) return false;//若所有结点(除1)沿正向边均能到达1结点且将边反向后也均能到达1结点,那么改图为强连通图
  24. return true;
  25. }
  26. int main()
  27. {
  28. while(scanf("%d%d",&V,&E)!=EOF&&V)
  29. {
  30. for(int i=;i<=V;i++) par[][i]=par[][i]=i;
  31. for(int i=;i<E;i++)
  32. {
  33. int u,v;
  34. scanf("%d%d",&u,&v);
  35. unite(u,v);
  36. }
  37. if(judge()) printf("Yes\n");
  38. else printf("No\n");
  39. }
  40.  
  41. return ;
  42. }
 

HDU1269(有向图缩点模板题)的更多相关文章

  1. HDU-3549 最大流模板题

    1.HDU-3549   Flow Problem 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 3.总结:模板题,参考了 http://ww ...

  2. Dancing Link --- 模板题 HUST 1017 - Exact cover

    1017 - Exact cover Problem's Link:   http://acm.hust.edu.cn/problem/show/1017 Mean: 给定一个由0-1组成的矩阵,是否 ...

  3. poj1511/zoj2008 Invitation Cards(最短路模板题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Invitation Cards Time Limit: 5 Seconds    ...

  4. HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题)

    HDU 1814 Peaceful Commission / HIT 1917 Peaceful Commission /CJOJ 1288 和平委员会(2-sat模板题) Description T ...

  5. [USACO07FEB]银牛派对Silver Cow Party---最短路模板题

    银牛排队 对于我这种蒟蒻来说,还是不要跑一次单元最短路.跑两次好写呀(- ̄▽ ̄)- 而题目中是有向图.如果如果按照题意进行最短路的话.就会出现一个单终点最短路和一个单起点最短路 对于单起点自然就是套模 ...

  6. LuoGu-P2863牛的舞会The Cow Prom[tarjan 缩点模板]

    传送门:https://www.luogu.org/problemnew/show/P2863 思路:tarjan模板题,之前会的tarjan,一直想学缩点到底是什么操作,发现就是把同组的放在一个数组 ...

  7. POJ 2186:Popular Cows Tarjan模板题

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 25945   Accepted: 10612 De ...

  8. 对Tarjan——有向图缩点算法的理解

    开始学tarjan的时候,有关无向图的割点.桥.点双边双缩点都比较容易地理解了,唯独对有向图的缩点操作不甚明了.通过对luoguP2656_采蘑菇一题的解决,大致搞清了tarjan算法的正确性. 首先 ...

  9. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

随机推荐

  1. 1-1:CSS3课程入门之属性选择器

    div[name=jewave] 选取属性名为name且属性值是"jewave"的元素 div[name^=jewave]选取属性名为name且属性值以"jewave&q ...

  2. 安装部署Solrcloud

    实验说明: 三台虚拟机做solrcloud集群                            安装solr前请确保jdk .tomcat.zookeeper已安装好,否则无法启动 三台虚拟机I ...

  3. SpringBoot定时任务升级篇(动态添加修改删除定时任务)

    需求缘起:在发布了<Spring Boot定时任务升级篇>之后得到不少反馈,其中有一个反馈就是如何动态添加修改删除定时任务?那么我们一起看看具体怎么实现,先看下本节大纲: (1)思路说明: ...

  4. 【BZOJ4173】数学 欧拉函数神题

    [BZOJ4173]数学 Description Input 输入文件的第一行输入两个正整数 . Output 如题 Sample Input 5 6 Sample Output 240 HINT N ...

  5. .Net反射机制

    现在谈.Net反射机制本不在计划中,因为本打算研究完设计模式后再去学习别的技术:但迫于设计模式系列一创建型之(抽象工厂模式)一章中遗留问题,才不得已在设计模式之游中插入本篇文章!签于本人对反射理解也不 ...

  6. python的接口类的思考?

    1.java怎么实现多继承的功效:https://www.cnblogs.com/Berryxiong/p/6142735.html 2.python的接口类和抽象类:https://www.cnbl ...

  7. (1)Web 应用是一个状态机,视图与状态是一一对应的。 (2)所有的状态,保存在一个对象里面。

    Redux 入门教程(一):基本用法 - 阮一峰的网络日志 http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_one_basic_u ...

  8. 360手机助手: App上架(提交资料)注意事项

    提交app资料尤其注意: .keystore和密码?由HBuilder提供公有证书: 签名证书KeyStore证书别名:hbuilder证书密码:123456keystore密码:123456 360 ...

  9. 性能测试--siege

    siege 这是Linux系统下的一个测试工具,完全使用C语言实现,可以对HTTP和FTP服务器进行负载和性能测试.通过使用Siege 提供的功能,可以很容易的制定测试计划:包括规定使用并发用户数.重 ...

  10. python cookbook第三版学习笔记二:字典

    一般来说字典中是一个键对应一个单值的映射,如果想一个键值映射多个值,那么就需要将这些值放到另外的容器中,比如列表或者集合. 比如d={'a':[1,2]} Collections中的defaultdi ...