【问题描述】

Henryy国正致力于首都的一个旅游电车建设工程。首都有N个旅游景区。Henryy国的电车永远只沿道路规定的方向行驶,为了不使投入使用的电车有可能无法回到它的起始站,Henryy希望知道他的首都的可以在哪些景区设置站点。一个景区可以被设置成车站,当且仅当对于任意一个从该景区出发所能到达的景区,均至少有一条路可回到该景区。你的同事已完成了一份景区之间的道路连通情况的报告。报告中将给出首都的景区数目N、道路总数M以及一些形如“景区A和景区B之间有一条从A到B的单向道路”的信息。现在明确你的任务:根据报告中的信息,列出所有可以被设置成车站的景区。

【输入文件】

输入文件由多份报告组成(这些报告相互无任何联系),每份报告包括:N,M,接下来M对整数Ai、Bi (1<=I<=M)表示Ai和Bi之间有一条单向道路Ai->Bi。仅一个包含整数N=0的报告表示你的工作结束,你的程序不应该对此有任何反应。各整数间用空格或空行分隔。对于任意景区,分别以该景区为起点或终点的道路总数均不超过50。

【输出文件】

对于每份报告,输出一行列表包括:所有能被设置成电车站点的景区编号,各编号之间用一个空格隔开。

【样例输入】

  1. 5 6
  2. 1 2
  3. 2 3
  4. 3 4
  5. 4 1
  6. 2 5
  7. 5 2
  8. 1 0
  9. 0

【样例输出】

  1. 1 2 3 4 5
  2. 1

【数据约定】

对于40%的数据,有N<=200。
对于100%的数据,有N<=5000,M<=50000。

  1. /*
  2. tarjan算法
  3. 题目要求求出的点满足它能连到的点也能连回来,那么就一定要与它在同一缩点中,如果一个缩点出度大于1,那么这个缩点中的所有点都不满足要求。
  4. */
  5. #include<cstdio>
  6. #include<iostream>
  7. #include<cstring>
  8. #include<algorithm>
  9. #define M 5010
  10. using namespace std;
  11. int num[M],low[M],instack[M],vis[M],belong[M],out[M],a[M][M],s
  12.  
  13. [M*],cnt,indexx,top;
  14. int head[M],n,m,ans[M];
  15. struct node
  16. {
  17. int v,pre;
  18. };node e[M*];
  19. int read()
  20. {
  21. char c=getchar();int num=,flag=;
  22. while(c<''||c>''){if(c=='-')flag=-;c=getchar();}
  23. while(c>=''&&c<=''){num=num*+c-'';c=getchar();}
  24. return num*flag;
  25. }
  26. void add(int i,int x,int y)
  27. {
  28. e[i].v=y;
  29. e[i].pre=head[x];
  30. head[x]=i;
  31. }
  32. void tarjan(int v)
  33. {
  34. num[v]=low[v]=++indexx;
  35. vis[v]=instack[v]=;
  36. s[++top]=v;
  37. for(int i=head[v];i;i=e[i].pre)
  38. {
  39. int w=e[i].v;
  40. if(!vis[w])
  41. {
  42. tarjan(w);
  43. low[v]=min(low[v],low[w]);
  44. }
  45. else if(instack[w])
  46. low[v]=min(low[v],num[w]);
  47. }
  48. int u;
  49. if(num[v]==low[v])
  50. {
  51. ++cnt;
  52. do
  53. {
  54. u=s[top--];
  55. instack[u]=;
  56. belong[u]=cnt;
  57. a[cnt][++a[cnt][]]=u;
  58. }while(u!=v);
  59. }
  60. }
  61. void work()
  62. {
  63. for(int i=;i<=m;i++)
  64. {
  65. int x=read(),y=read();
  66. add(i,x,y);
  67. }
  68. for(int i=;i<=n;i++)
  69. if(!vis[i])tarjan(i);
  70. for(int i=;i<=n;i++)
  71. for(int j=head[i];j;j=e[j].pre)
  72. if(belong[i]!=belong[e[j].v])
  73. out[belong[i]]++;
  74. int k=;
  75. for(int i=;i<=cnt;i++)if(!out[i])
  76. for(int j=;j<=a[i][];j++)
  77. ans[++k]=a[i][j];
  78. sort(ans+,ans+k+);
  79. for(int i=;i<=k;i++)
  80. printf("%d ",ans[i]);
  81. printf("\n");
  82. }
  83. int main()
  84. {
  85. freopen("buss.in","r",stdin);
  86. freopen("buss.out","w",stdout);
  87. while()
  88. {
  89. n=read();if(!n)break;
  90. m=read();
  91. memset(head,,sizeof(head));
  92. memset(num,,sizeof(num));
  93. memset(low,,sizeof(low));
  94. memset(vis,,sizeof(vis));
  95. memset(instack,,sizeof(instack));
  96. memset(s,,sizeof(s));
  97. memset(e,,sizeof(e));
  98. memset(belong,,sizeof(belong));
  99. memset(out,,sizeof(out));
  100. memset(a,,sizeof(a));
  101. indexx=cnt=top=;
  102. work();
  103. }
  104. return ;
  105. }

旅游电车(cogs 1175)的更多相关文章

  1. COGS——T 1175. [顾研NOIP] 旅游电车

    http://www.cogs.pro/cogs/problem/problem.php?pid=1175 ★★☆   输入文件:buss.in   输出文件:buss.out   简单对比时间限制: ...

  2. cojs 1175. [顾研NOIP] 旅游电车

    1175. [顾研NOIP] 旅游电车 ★★☆   输入文件:buss.in   输出文件:buss.out   简单对比时间限制:1 s   内存限制:256 MB [问题描述] Henryy国正致 ...

  3. AC日记——[国家集训队2011]旅游(宋方睿) cogs 1867

    [国家集训队2011]旅游(宋方睿) 思路: 树链剖分,边权转点权: 线段树维护三个东西,sum,max,min: 当一个区间变成相反数时,sum=-sum,max=-min,min=-max: 来, ...

  4. BZOJ 2157: 旅游( 树链剖分 )

    树链剖分.. 样例太大了根本没法调...顺便把数据生成器放上来 -------------------------------------------------------------------- ...

  5. 旅游公司招聘Java工程师

    公司招聘:岗位要求如下 Java开发工程师工作内容1.根据需求完成软件系统代码的开发,测试以及文档撰写工作:2.分析并解决客户的问题:3.配合业务部门进行数据分析以及系统优化 岗位要求:1.本科以上学 ...

  6. 基于GIS的旅游辐射区人口统计

    在旅游规划中,考虑旅游景点周边的人口负载量是很重要的一个方面,这将直接影响资源的投入和配置,开发潜力和规模等.基于GIS可以将人口信息进行空间化的展示,还可以通过空间分析的方法计算出旅游景点辐射区的人 ...

  7. Java基础-多线程编程-1.随便选择两个城市作为预选旅游目标。实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市。分别用Runnable接口和Thread类实现。

    1.随便选择两个城市作为预选旅游目标.实现两个独立的线程分别显示10次城市名,每次显示后休眠一段随机时间(1000ms以内),哪个先显示完毕,就决定去哪个城市.分别用Runnable接口和Thread ...

  8. 中国175个 AAAAA级风景区,去过20个 以上,你就是旅游达人

    省份 数量 景区名称 我 北京 7 故宫博物院 1 天坛公园 颐和园 1 八达岭-慕田峪长城旅游区 1 明十三陵景区(神路-定陵-长陵-昭陵) 恭王府景区 北京奥林匹克公园(鸟巢-水立方-中国科技馆- ...

  9. VR技术驱动智慧旅游,自由漫步西湖不是梦

         虚拟现实技术是今年最热门的科技之一,不少行业都在嫁接VR功能,其中旅游业也具备这方面的优势.VR+旅游,能让你足不出户即可感受清净唯美的名胜古迹.据591ARVR资讯网www.591arvr ...

随机推荐

  1. canvas particles

    var canvas = document.getElementById('canvas'); var ctx = canvas.getContext('2d'); var Grewer = { in ...

  2. codechef: ADAROKS2 ,Ada Rooks 2

    又是道原题... (HDU 6313 Hack It , 多校 ACM 里面的题) 题目说构造一个 n * n 矩阵,染色点不得构成矩形...然后染色点个数至少 8 * n 然后我们生成一个数 m , ...

  3. AGC16E Poor Turkeys

    输入样例: 10 10 8 9 2 8 4 6 4 9 7 8 2 8 1 8 3 4 3 4 2 7 输出样例#6: 5 话说这题虽然不是很OI但是确实挺锻炼思维的 一开始以为是用并查集之类的东西维 ...

  4. yii int

    @echo off rem ------------------------------------------------------------- rem Yii command line ini ...

  5. Farseer.net轻量级开源框架 入门篇:添加数据详解

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 分类逻辑层 下一篇:Farseer.net轻量级开源框架 入门篇: 修改数据详解 ...

  6. Android Measure 体系简单总结

    Android对View的测量是半协商半强制半模糊半具体的. 测量过程中的两套尺寸体系:  [半强制] ParentView**约束ChildView: **MeasureSpec(通过measure ...

  7. 打造个人的vimIDE

    环境说明 系统版本:centos7.Ubuntu16 vim版本:7.4 安装git工具 整体说明:本文的vim配置是针对Linux的单个系统用户,python的自动补全使用的是 jedi-vim 插 ...

  8. 手机端h5复制功能

    html: <a href="javascript:;" id="copyBtn" class="f-r tac" data-clip ...

  9. Queueingconsumer 找不到

    springboot从1.5.9升级到2.0.0,queueingconsumer报错没有这个类,改为使用 DefaultConsumer

  10. thupc & cts & apio & thusc 游记 (北京17日游记)

    thupc & cts & apio & thusc 游记 (北京17日游记) Day 0 和隔壁校两人py了一下,六个人组了两队,(左哼哼)与(右哼哼),我和Camoufla ...