题目大意:给出一个有向图,问你这个图中是否对于任意两点\(u,v\),都至少满足\(u\to v\)(\(u\)可到达\(v\),下同)或\(v\to u\)中的一个。

一看就是套路的图论题,我们先把边连起来。

考虑一个很基本的性质:在一个强连通分量的点两两可达

于是肯定先Tarjan缩一波点。然后我们得到了一个DAG

接下来就是考虑是否有两个点(当然是缩点之后的了)互不可达

这个可以直接跑一边拓扑排序。然后看一下是否在某个时刻有两个点的入度为零即可。

CODE

  1. #include<cstdio>
  2. #include<cctype>
  3. #include<cstring>
  4. using namespace std;
  5. const int N=1005;
  6. struct edge
  7. {
  8. int to,next;
  9. }e[N*6],ne[N*6];
  10. int head[N],nhead[N],t,n,m,x,y,cnt,tot,sum,dfn[N],low[N],col[N],stack[N],ru[N],q[N],top;
  11. bool vis[N];
  12. inline char tc(void)
  13. {
  14. static char fl[100000],*A=fl,*B=fl;
  15. return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
  16. }
  17. inline void read(int &x)
  18. {
  19. x=0; char ch; while (!isdigit(ch=tc()));
  20. while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
  21. }
  22. inline void add(int x,int y)
  23. {
  24. e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
  25. }
  26. inline void nadd(int x,int y)
  27. {
  28. ne[++cnt].to=y; ne[cnt].next=nhead[x]; nhead[x]=cnt;
  29. }
  30. inline void clear(void)
  31. {
  32. memset(head,-1,sizeof(head)); memset(e,-1,sizeof(e));
  33. memset(nhead,-1,sizeof(nhead)); memset(ne,-1,sizeof(ne));
  34. memset(dfn,0,sizeof(dfn)); memset(vis,0,sizeof(vis));
  35. memset(col,0,sizeof(col)); memset(ru,0,sizeof(ru));
  36. cnt=tot=sum=top=0;
  37. }
  38. inline int min(int a,int b)
  39. {
  40. return a<b?a:b;
  41. }
  42. inline void Tarjan(int now)
  43. {
  44. dfn[now]=low[now]=++tot; vis[now]=1; stack[++top]=now;
  45. for (register int i=head[now];i!=-1;i=e[i].next)
  46. if (!dfn[e[i].to]) Tarjan(e[i].to),low[now]=min(low[now],low[e[i].to]);
  47. else if (vis[e[i].to]) low[now]=min(low[now],dfn[e[i].to]);
  48. if (dfn[now]==low[now])
  49. {
  50. vis[now]=0; col[now]=++sum;
  51. while (now!=stack[top])
  52. {
  53. vis[stack[top]]=0; col[stack[top--]]=sum;
  54. } --top;
  55. }
  56. }
  57. inline bool top_sort(void)
  58. {
  59. register int i,H=0,T=0;
  60. for (i=1;i<=sum;++i)
  61. if (!ru[i]) q[++T]=i;
  62. while (H<T)
  63. {
  64. if (T-H>1) return 0;
  65. int now=q[++H];
  66. for (i=nhead[now];i!=-1;i=ne[i].next)
  67. if (!(--ru[ne[i].to])) q[++T]=ne[i].to;
  68. }
  69. return 1;
  70. }
  71. int main()
  72. {
  73. //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
  74. register int i,j; read(t);
  75. while (t--)
  76. {
  77. clear(); read(n); read(m);
  78. for (i=1;i<=m;++i)
  79. read(x),read(y),add(x,y);
  80. for (i=1;i<=n;++i)
  81. if (!dfn[i]) Tarjan(i);
  82. for (cnt=0,i=1;i<=n;++i)
  83. for (j=head[i];j!=-1;j=e[j].next)
  84. if (col[i]!=col[e[j].to]) nadd(col[i],col[e[j].to]),++ru[col[e[j].to]];
  85. if (top_sort()) puts("I love you my love and our love save us!"); else puts("Light my fire!");
  86. }
  87. return 0;
  88. }

HDU 6165 FFF at Valentine的更多相关文章

  1. 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】

    FFF at Valentine Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  2. HDU 6165 FFF at Valentine(Tarjan缩点+拓扑排序)

    FFF at Valentine Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  3. 2017ACM暑期多校联合训练 - Team 9 1005 HDU 6165 FFF at Valentine (dfs)

    题目链接 Problem Description At Valentine's eve, Shylock and Lucar were enjoying their time as any other ...

  4. HDU 6170 FFF at Valentine(强联通缩点+拓扑排序)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6165 题意:给你一个无环,无重边的有向图,问你任意两点,是否存在路径使得其中一点能到达另一点 解析:强 ...

  5. FFF at Valentine(强连通分量缩点+拓扑排序)

    FFF at Valentine Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  6. 【2017 Multi-University Training Contest - Team 9】FFF at Valentine

    [链接]http://acm.hdu.edu.cn/showproblem.php?pid=6165 [题意] 一张有向图,n个点,m条边,保证没有重边和自环.询问任意两个点能否满足任何一方能够到达另 ...

  7. hdu 6165

    虽然题解上说缩点然后判断入度就可以了,然后比赛的时候瞎暴力过了. #include <iostream> #include <cstring> #include <str ...

  8. Valentine's Day Round hdu 5176 The Experience of Love [好题 带权并查集 unsigned long long]

    传送门 The Experience of Love Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  9. HDU 6693 Valentine's Day (概率)

    2019 杭电多校 10 1003 题目链接:HDU 6693 比赛链接:2019 Multi-University Training Contest 10 Problem Description O ...

随机推荐

  1. springcloud 入门 8 (config配置中心)

    Spring Cloud Config: 配置中心为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件,它就是Spring Cloud Config. 在分布式系统中,由于服务数量巨多, ...

  2. macos 下安装brew

    1.终端执行 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master ...

  3. 盐城 - 开设IT公司的好地方

    盐城:位于江苏省北部,这一好像只能算三线的城市,不久前当选为“国家中心城市”.在全国仅有的50城市中名列34.它可成为发展IT产业的好地方. (1)人才济济.从这里走出去的高级人才数不胜数,留在这里的 ...

  4. 使用sklearn机器学习库实现线性回归

    import numpy as np  # 导入科学技术框架import matplotlib.pyplot as plt  # 导入画图工具from sklearn.linear_model imp ...

  5. 将 Windows 虚拟机从非托管磁盘转换为托管磁盘

    如果有使用非托管磁盘的现有 Windows 虚拟机 (VM),可通过 Azure 托管磁盘服务将 VM 转换为使用托管磁盘. 此过程会同时转换 OS 磁盘和任何附加的数据磁盘. 本文介绍如何使用 Az ...

  6. SpringBoot整合Rabbitmq设置消息请求头

    String str = "{\"origin\":\"BBC\",\"origin_coupon_id\":51,\" ...

  7. VRS——备忘

    1.所有版本VRS,注释掉m_ChisauarePRN参数 2.注释掉所有的MODULE_GNSSMonitor_ID,暂时用不到.但是会造成basestation崩掉. n.RegisterStat ...

  8. Python进阶(一)

    完成慕课网的python基础学习以后,大约花了三天时间,平均每天一个小时,总结了一些比较好的例题和思想方法,下面来学习python进阶吧 参考廖雪峰官方课程 函数 python官方函数调用文档 定义默 ...

  9. 17秋 软件工程 团队第五次作业 Alpha Scrum7

    17秋 软件工程 团队第五次作业 Alpha Scrum7 今日完成的任务 世强:部员详情列表的编写与数据交互,完善APP通知模块: 港晨:完成前端登陆界面编写: 树民:完善Web后端数据库访问模块: ...

  10. Decentraleyes - Local emulation of Content Delivery Networks

    Decentraleyes, 是一个本地化第三方库文件的浏览器插件,提供三十多种语言支持.大致原理如下: 保存常用的第三方库文件到本地,当打开的页面中需要加载的第三方库文件在本地有副本时,随即进行拦截 ...