2822 爱在心中

时间限制: 1 s

 空间限制: 128000 KB
 题目等级 : 钻石 Diamond 

题目描述 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

数据范围及提示 Data Size & Hint

各个测试点1s

分类标签 Tags 点此展开

题解:一道比较明显的tarjan强连通分量,和BZOj1051基本一样,值得注意几点——1.由于有可能存在整个图不连通的情况,同时更有可能从1#点出发不能到达很多点(比如1#的前驱们),所以不要直接来个tarjan(1)就想了事,建议直接每个点跑一下(很明显之前被跑过的点可以在本次无视之,而且实际上也就是经过了M条边而已,所以不必担心时间问题)  2.这题里面的“爱心天使”绝对不完全等价于全部强连通分量——注意分量只有一个点的情况,这时候可不算“爱心天使”  3.看样子codevs上面此题数据有些小(虽然没标明数据规模),我在bzoj上面148ms,在这上就9ms?!?!呵呵呵,而且我的程序后面很明显有比较冗余的语句,完全可以不必那么写的

That's all。。。别的没了。。。(只要会tarjan)

  1 type
  2         point=^node;
  3         node=record
  4                 g:longint;
  5                 next:point;
  6         end;
  7 var
  8         i,j,k,l,m,n,h,t,ans:longint;
  9         a:array[-1..20000] of point;
 10         ss,s:array[0..20000] of boolean;
 11         low,dfn,f,b,c,d:array[0..20000] of longint;
 12         p:point;
 13 function max(x,y:longint):longint;inline;
 14         begin
 15                 if x>y then max:=x else max:=y;
 16         end;
 17 function min(x,y:longint):longint;inline;
 18         begin
 19                 if x<y then min:=x else min:=y;
 20         end;
 21 procedure add(x,y:longint);inline;
 22         var p:point;
 23         begin
 24                 new(p);p^.g:=y;
 25                 p^.next:=a[x];a[x]:=p;
 26         end;
 27 procedure tarjan(x:longint);
 28         var
 29                 p:point;
 30         begin
 31                 inc(h);low[x]:=h;dfn[x]:=h;
 32                 inc(t);f[t]:=x;ss[x]:=true;s[x]:=true;
 33                 p:=a[x];
 34                 while p<>nil do
 35                         begin
 36                                 if s[p^.g]=false then
 37                                         begin
 38                                                 tarjan(p^.g);
 39                                                 low[x]:=min(low[x],low[p^.g]);
 40                                         end
 41                                 else if ss[p^.g] then low[x]:=min(low[x],dfn[p^.g]);
 42                                 p:=p^.next;
 43                         end;
 44                 if low[x]=dfn[x] then
 45                         begin
 46                                 inc(ans);
 47                                 while f[t+1]<>x do
 48                                         begin
 49                                                 ss[f[t]]:=false;
 50                                                 b[f[t]]:=ans;
 51                                                 dec(t);
 52                                         end;
 53                         end;
 54         end;
 55 begin
 56         readln(n,m);
 57         for i:=1 to n do a[i]:=nil;
 58         for i:=1 to m do
 59                 begin
 60                         readln(j,k);
 61                         add(j,k);
 62                 end;
 63         fillchar(s,sizeof(s),false);
 64         fillchar(ss,sizeof(ss),false);
 65         fillchar(f,sizeof(f),0);
 66         fillchar(low,sizeof(low),0);
 67         fillchar(dfn,sizeof(dfn),0);
 68         fillchar(b,sizeof(b),0);ans:=0;h:=0;t:=0;
 69         for i:=1 to n do if b[i]=0 then
 70                 tarjan(i);
 71         fillchar(c,sizeof(c),0);l:=ans;
 72         for i:=1 to n do inc(c[b[i]]);
 73         for i:=1 to ans do if c[i]=1 then dec(l);
 74         writeln(l);
 75         fillchar(d,sizeof(d),0);
 76         for i:=1 to n do
 77                 begin
 78                         p:=a[i];
 79                         while p<>nil do
 80                                 begin
 81                                         if b[i]<>b[p^.g] then inc(d[b[i]]);
 82                                         p:=p^.next;
 83                                 end;
 84                 end;
 85         l:=-1;
 86         for i:=1 to ans do
 87                 begin
 88                         if d[i]=0 then
 89                                 begin
 90                                         if l=-1 then
 91                                                 l:=i
 92                                         else
 93                                                 begin
 94                                                         writeln(-1);
 95                                                         halt;
 96                                                 end;
 97                                 end;
 98                 end;
 99         if l=-1 then
100                 begin
101                         writeln(-1);
102                         halt;
103                 end;
104         a[0]:=nil;k:=0;
105         for i:=1 to n do
106                 if b[i]=l then
107                         begin
108                                 add(0,i);
109                                 inc(k);
110                         end;
111         if k<2 then
112                 begin
113                         writeln(-1);
114                         halt;
115                 end;
116         p:=a[0];
117         a[-1]:=nil;
118         while p<>nil do
119                 begin
120                         add(-1,p^.g);
121                         p:=p^.next;
122                 end;
123         p:=a[-1];
124         while p<>nil do
125                 begin
126                         write(p^.g);
127                         if p^.next<>nil then write(' ');
128                         p:=p^.next;
129                 end;
130         writeln;
131         writeln;
132 end.

转载于:https://www.cnblogs.com/HansBug/p/4276065.html

Codevs2822 爱在心中相关推荐

  1. 【codevs2822】爱在心中 tarjan 缩点+理解

    [codevs2822]爱在心中 2014年1月26日5580 题目描述 Description "每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡 ...

  2. Codevs 2822 爱在心中

    http://codevs.cn/problem/2822/ 思路 Tarjin算法找出图中所有的节点数>1的环即爱心天使,将每个爱心天使缩成一个点,重新建图,在新图中找到一个入度为0的点(至多 ...

  3. XENOGEARS,延续万年的的永恒之爱(引)

    我不知如何去讲述这样一个故事和故事里的人们,我只能以一个既俗气又永恒的名词来做切入点,那个词语是"爱情". 未曾接触过尼采,也不太知晓副标题"权利与意志",&q ...

  4. 加勒比的伤感爱情日志分享:如果你知道我也爱你

    加勒比的伤感爱情日志分享:如果你知道我也爱你 - 加勒比的伤感爱情日志分享:如果你知道我也爱你 如果爱需要时间去守候我愿意为你守候一生, 直至你爱上我的那天,如果爱需要行动去证明, 我愿意为了你而放弃 ...

  5. 心得体悟帖---12、志向还是太短浅,目光也是

    心得体悟帖---12.志向还是太短浅,目光也是 一.总结 一句话总结: p*的*n,你为什么会觉得不可能了呢,这才是最大的问题. 1.无欲无求是非常糟糕的状态,修仙小说中的主角每时每刻都面临着巨大无比 ...

  6. Conclusion

    /* 高中最后一个暑假 挺有意义的 考了一暑假的试 最后总结一下吧 一天一天来吧7.30 这一天的题有点变态啊 不过难题有难题的做法 T1斗地主 考试的时候打了0分 0分..... 原因好像是读入的格 ...

  7. Angular 4.x 事件管理器及自定义EventManagerPlugin

    在 Angular 中如何为同一个表达式绑定多个事件呢?如果我们这样做可能会是这样的: <div><button (click, mouseover)="onClick() ...

  8. 《who Who Are You Working For》(你在为谁工作)

    为什么80%的码农都做不了架构师?>>>    触动心底的反思 你在为谁工作 "我们到底是在为谁工作呢?"如果不尽快弄清这个问题,不调整好自己的心态,今生我们很可 ...

  9. 【哈佛学习力5:情绪管理】

    [情绪管理] 我想请大家回想一下,你有没有过在考场上非常的紧张.在工作中到压力很大.非常焦虑的时候.在那样的状态下,你是不是没有办法完全的施展出自己100%的能力. 那很可能你会说,有啊,我知道了,这 ...

最新文章

  1. 程序员笔记|如何编写优雅的Dockerfile
  2. error java on syntax token_解决Java“syntax error on token enum”问题
  3. 开源自建/托管与商业化自研 Trace,如何选择?
  4. uniapp开发实例github_跨端开发痛点?送你一款Vue最流行的跨端框架——uni-app
  5. BZOJ2759 一个动态树好题
  6. Linux touch命令:创建文件及修改文件时间戳
  7. springmvc流程_基于Spring MVC框架的Http流程分析
  8. php手机短信验证码用cookie存好还是session存好,保存登录信息的时候用session好还是cookie好?...
  9. 由遍历序列构造二叉树
  10. 阿里云 部署并开启nodejs应用
  11. lammps教程:单原子温度计算及输出方法
  12. linux搭建ntp发包教程,linux 搭建本地ntp服务器
  13. Python干货:破解40大机器学习面试题(包含初中高级)
  14. 解决2020R2,2022R1等版本的SCDM无法编辑草图尺寸的问题
  15. 8月24日科技联播:特斯拉回应苹果“疯狂挖人”,对方比我们有钱100倍
  16. c语言中特殊符号怎么定义,C语言特殊符号意义
  17. 2009年最极品的冷笑话汇集!(超经典)
  18. 2018区块链技术及应用峰会(BTA)·中国全日程发布,大会倒计时5天
  19. 关于Win10系统-svchost大量占用网速及自动更新问题——完美解决
  20. 论CTOR添加到11月BCH协议升级

热门文章

  1. PHP如何验证以太坊签名
  2. MIT CSAIL最新研究:将AI应用于流媒体视频,可获得更好的播放体验
  3. python requests post 中文乱码问题
  4. 查看系统各个进程打开的文件描述符数量
  5. Camel In Action 读书笔记 (1)
  6. HttpClient用法
  7. 点击弹窗 input直接是待输入状态_第六课:你知道如何用两行代码做个弹窗吗?看这里...
  8. nginx引用外部配置
  9. 高斯白噪声的Verilog实现
  10. 6、spring拦截器