【codevs2822】爱在心中

2014年1月26日5580

题目描述 Description

“每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动。爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home。”

在爱的国度里有N个人,在他们的心中都有着一个爱的名单,上面记载着他所爱的人(不会出现自爱的情况)。爱是具有传递性的,即如果A爱B,B爱C,则A也爱C。
如果有这样一部分人,他们彼此都相爱,则他们就超越了一切的限制,用集体的爱化身成为一个爱心天使。
现在,我们想知道在这个爱的国度里会出现多少爱心天使。而且,如果某个爱心天使被其他所有人或爱心天使所爱则请输出这个爱心天使是由哪些人构成的,否则输出-1。

输入描述 Input Description

第1行,两个数N、M,代表爱的国度里有N个人,爱的关系有M条。
第2到第M+1行,每行两个数A、B,代表A爱B。

输出描述 Output Description

第1行,一个数,代表爱的国度里有多少爱心天使。
第2行,如果某个爱心天使被其他所有人和爱心天使所爱则请输出这个爱心天使是由哪些人构成的(从小到大排序),否则输出-1。

样例输入 Sample Input

样例输入1:

6 7
1 2
2 3
3 2
4 2
4 5
5 6
6 4
样例输入2:

3 3
1 2
2 1
2 3

样例输出 Sample Output

样例输出1:

2
2 3

样例输出2:

1
-1

代码

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <ctime>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <set>
  8. #include <vector>
  9. #include <queue>
  10. #include <typeinfo>
  11. #include <map>
  12. #include<bits/stdc++.h>
  13. typedef long long ll;
  14. using namespace std;
  15. #define inf 10000000
  16. inline ll read()
  17. {
  18. ll x=,f=;
  19. char ch=getchar();
  20. while(ch<''||ch>'')
  21. {
  22. if(ch=='-')f=-;
  23. ch=getchar();
  24. }
  25. while(ch>=''&&ch<='')
  26. {
  27. x=x*+ch-'';
  28. ch=getchar();
  29. }
  30. return x*f;
  31. }
  32. //***************************************************************
  33.  
  34. struct ss
  35. {
  36. int u,to,next;
  37. } e[];
  38. int out[];
  39. int head[],vis[],dfn[],low[],belong[],hav[];
  40. int q[],inq[];
  41. int t=,bcnt,cnt,n,m,top;
  42. void add(int u,int v)
  43. {
  44. e[t].to=v;
  45. e[t].u=u;
  46. e[t].next=head[u];
  47. head[u]=t++;
  48. }
  49. void dfs(int u)
  50. {
  51. vis[u]=inq[u]=;
  52. low[u]=dfn[u]=++cnt;
  53. q[++top]=u;
  54. for(int i=head[u]; i; i=e[i].next)
  55. {
  56. if(!vis[e[i].to])
  57. {
  58. dfs(e[i].to);
  59. low[u]=min(low[u],low[e[i].to]);
  60. }
  61. else if(inq[e[i].to])low[u]=min(low[u],dfn[e[i].to]);
  62. }
  63. int v=-;
  64. if(low[u]==dfn[u])
  65. {
  66. bcnt++;
  67. while(v!=u)
  68. {
  69. v=q[top--];
  70. inq[v]=;
  71. belong[v]=bcnt;
  72. hav[bcnt]++;
  73. }
  74. }
  75. }
  76. void rebuild()
  77. {
  78.  
  79. for(int i=; i<=m; i++)
  80. {
  81. if(belong[e[i].u]!=belong[e[i].to])
  82. {
  83. out[belong[e[i].u]]++;
  84. }
  85. }
  86. }
  87. void tarjan()
  88. {
  89. for(int i=; i<=n; i++)
  90. {
  91. if(!vis[i])
  92. {
  93. dfs(i);
  94. }
  95. }
  96. rebuild();
  97. }
  98. void work()
  99. {
  100. int res=;
  101. int ans;
  102. for(int i=; i<=bcnt; i++)
  103. {
  104. if(out[i]==)
  105. {
  106. ans=i;
  107. res++;
  108. }
  109. }
  110. int bb=;
  111. for(int i=;i<=bcnt;i++)
  112. {
  113. if(hav[i]>=)bb++;
  114. }
  115. cout<<bb<<endl;
  116. if(res==)
  117. {
  118. if(hav[ans]!=)
  119. {
  120. int kk=;
  121. int hh[];
  122. for(int i=; i<=n; i++)
  123. {
  124. if(belong[i]==ans)
  125. {
  126. hh[++kk]=i;
  127. }
  128. }
  129. for(int i=; i<kk; i++)
  130. {
  131. printf("%d ",hh[i]);
  132. }
  133. cout<<hh[kk]<<endl;
  134. }
  135. else cout<<-<<endl;
  136.  
  137. }
  138. else cout<<-<<endl;
  139. }
  140. int main()
  141. {
  142. int u,v;
  143. scanf("%d%d",&n,&m);
  144. for(int i=; i<=m; i++)
  145. {
  146. scanf("%d%d",&u,&v);
  147. add(u,v);
  148. }
  149. tarjan();
  150. work();
  151. return ;
  152. }

【codevs2822】爱在心中 tarjan 缩点+理解的更多相关文章

  1. codevs2822 爱在心中

      2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无 ...

  2. 【CodeVS 2822】爱在心中

    “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度里有N个人,在他们的心中都有着一个 ...

  3. POJ 1236 Network of Schools(Tarjan缩点)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16806   Accepted: 66 ...

  4. 【BZOJ-1797】Mincut 最小割 最大流 + Tarjan + 缩点

    1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1685  Solved: 724[Submit] ...

  5. P1262 间谍网络 (tarjan缩点 水过去)

    题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...

  6. Tarjan缩点+LCA【p2783】有机化学之神偶尔会做作弊

    Description 你翻到那一题:给定一个烃,只含有单键(给初中生的一个理解性解释:就是一堆碳用横线连起来,横线都是单条的). 然后炎魔之王拉格纳罗斯用他的火焰净化了一切环(???).所有的环状碳 ...

  7. 初涉tarjan缩点

    tarjan缩点:口胡过好多题,不过从来没写过…… 什么是缩点 tarjan和Kosaraju.Gabow算法一样,是为了求有向图中的强连通分量.因为有向图中大多数情况下会有环存在,而有环是一个不甚好 ...

  8. tarjan 缩点 求 scc

    算法学自 BYVoid https://www.byvoid.com/zhs/blog/scc-tarjan/ 这个写得很清楚了 当然 你可能不这么认为 而且 如果是让我 一开始就从这个博客 学 ta ...

  9. tarjan缩点(洛谷P387)

    此题解部分借鉴于九野的博客 题目分析 给定一个 \(n\) 个点 \(m\) 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个 ...

随机推荐

  1. afasf

    http://www.cnblogs.com/ttzhang/archive/2008/11/02/1324601.html project server 2007 sn :W2JJW-4KYDP-2 ...

  2. c/c++指针

    指针主要分: 指向单一的某个对象/变量, 用于多态或函数指针, 这个不难 - 一级指针 其次是指向数组, 用来操作/遍历数组元素 - 一级/二级指针 指向数组的一级指针很简单了: p指向的是数组的元素 ...

  3. Linux无法使用userdel删除用户和组的解决办法

    转自:http://www.linuxidc.com/Linux/2013-07/87371.htm 简述: 今天在看书的时候,看到有个实例,手痒痒的跟着做了起来...但是,出现问题了..测试的用户和 ...

  4. SecureCRT光标颜色

    SecureCRT连linux光标一直没有,尤其是在vim编辑文档的时候特别麻烦,今天找出解决办法: 选项->会话选项->仿真:将ANSI颜色选中: 选项->会话选项->外观: ...

  5. 解读JSP的解析过程

    解读JSP的解析过程 互联网上,这方面的资料实在太少了,故把自己研究的一些结果公布出来. 首先,问大家几个问题,看大家能不能回答出来,或者在网上能不能找到答案: 1.page.include.tagl ...

  6. linux下搭建Nginx

    Linux上搭建nginx,及简单配置  在上家公司都是运维安装nginx,到新公司后代码开发完成部署测试服务器要求自己装nginx,研究了好久安装好之后,到正式上线还要自己安装,索性把安装步骤自己记 ...

  7. [Effective JavaScript 笔记]第54条:将undefined看做“没有值”

    undefined值很特殊,每当js无法提供具体的值时,就会产生undefined. undefined值场景 未赋值的变量的初始值即为undefined. var x; x;//undefined ...

  8. [OpenJudge 3063]罪犯问题

    [OpenJudge 3063]罪犯问题 试题描述 一天,警官抓获了N个嫌犯,审问N个罪犯的途中,作为警长助手的你突然发现其中被确定为罪犯的K号人是你曾经出生入死的兄弟,你不能眼睁睁看着他被抓进牢里. ...

  9. Calico在Kubernetes中的搭建

    一,需求 Kubernetes官方推荐的是Flannel,但是Flannel是一个overlay的网络,对性能会有一定的影响.Calico恰好能解决一下overlay网络的不足. Calico在Kub ...

  10. Continuous Subarray Sum

    Given an integer array, find a continuous subarray where the sum of numbers is the biggest. Your cod ...