题目链接:

http://www.lydsy.com/JudgeOnline/problem.php?id=1051

题解:

强连通缩点得到DAG图,将图转置一下,对入度为零的点跑dfs看看能不能访问到所有的点。

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<stack>
  5. #include<algorithm>
  6. #include<cstring>
  7. using namespace std;
  8.  
  9. const int maxn = + ;
  10. const int INF = 0x3f3f3f3f;
  11.  
  12. vector<int> G[maxn],G2[maxn];
  13. int pre[maxn], lowlink[maxn], sccno[maxn], dfs_clock, scc_cnt;
  14. int ind[maxn],siz[maxn],vis[maxn];
  15. stack<int> S;
  16.  
  17. int n,m;
  18.  
  19. void dfs(int u) {
  20. pre[u] = lowlink[u] = ++dfs_clock;
  21. S.push(u);
  22. for (int i = ; i < G[u].size(); i++) {
  23. int v = G[u][i];
  24. if (!pre[v]) {
  25. dfs(v);
  26. lowlink[u] = min(lowlink[u], lowlink[v]);
  27. }
  28. else if (!sccno[v]) {
  29. lowlink[u] = min(lowlink[u], pre[v]);
  30. }
  31. }
  32. if (lowlink[u] == pre[u]) {
  33. scc_cnt++;
  34. int cnt = ;
  35. for (;;) {
  36. cnt++;
  37. int x = S.top(); S.pop();
  38. sccno[x] = scc_cnt;
  39. if (x == u) break;
  40. }
  41. siz[scc_cnt] = cnt;
  42. }
  43. }
  44.  
  45. void find_scc(int n) {
  46. dfs_clock = scc_cnt = ;
  47. memset(sccno, , sizeof(sccno));
  48. memset(pre, , sizeof(pre));
  49. for (int i = ; i < n; i++) if (!pre[i]) dfs(i);
  50. //for (int i = 0; i < n; i++) printf("sccno[%d]:%d\n", i, sccno[i]);
  51. }
  52.  
  53. void dfs2(int u) {
  54. if (vis[u]) return;
  55. vis[u] = ;
  56. for (int i = ; i < G2[u].size(); i++) {
  57. int v = G2[u][i];
  58. dfs2(v);
  59. }
  60. }
  61.  
  62. void init() {
  63. for (int i = ; i < n; i++) G[i].clear(), G2[i].clear();
  64. memset(ind, ,sizeof(ind));
  65. memset(vis, , sizeof(vis));
  66. }
  67.  
  68. int main() {
  69. while (scanf("%d%d", &n,&m) == && n) {
  70. init();
  71. for (int i = ; i < m; i++) {
  72. int u, v;
  73. scanf("%d%d", &u, &v); u--, v--;
  74. G[u].push_back(v);
  75. }
  76. find_scc(n);
  77. for (int i = ; i < n; i++) {
  78. for (int j = ; j < G[i].size(); j++) {
  79. int v = G[i][j];
  80. if (sccno[i] != sccno[v]) {
  81. G2[sccno[v]].push_back(sccno[i]);
  82. ind[sccno[i]]++;
  83. }
  84. }
  85. }
  86. int rt = -;
  87. for (int i = ; i <= scc_cnt; i++) {
  88. if (ind[i] == ) rt = i;
  89. }
  90. dfs2(rt);
  91. int su = ;
  92. for (int i = ; i <= scc_cnt; i++) {
  93. if (!vis[i]) {
  94. su = ;
  95. break;
  96. }
  97. }
  98. if (su) {
  99. printf("%d\n", siz[rt]);
  100. }
  101. else {
  102. printf("0\n");
  103. }
  104. }
  105. return ;
  106. }

BZOJ 1051: [HAOI2006]受欢迎的牛 强连通缩点的更多相关文章

  1. bzoj 1051: [HAOI2006]受欢迎的牛 tarjan缩点

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2092  Solved: 1096[Submit][Sta ...

  2. bzoj 1051: [HAOI2006]受欢迎的牛 (Tarjan 缩点)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1051 思路: 首先用Tarjan把环缩成点,要想收到所有人的欢迎,那么这个点的出度必为0,且 ...

  3. BZOJ 1051: [HAOI2006]受欢迎的牛( tarjan )

    tarjan缩点后, 有且仅有一个出度为0的强连通分量即answer, 否则无解 ----------------------------------------------------------- ...

  4. BZOJ 1051: [HAOI2006]受欢迎的牛(SCC)

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8172  Solved: 4470[Submit][Sta ...

  5. BZOJ 1051: [HAOI2006]受欢迎的牛 缩点

    1051: [HAOI2006]受欢迎的牛 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

  6. 洛谷 P2341 BZOJ 1051 [HAOI2006]受欢迎的牛

    题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜 欢B,B喜欢C,那么A也喜欢C ...

  7. BZOJ 1051: [HAOI2006]受欢迎的牛

    Description 一个有向图,求所以能被别的点到达的点的个数. Sol Tarjan + 强连通分量 + 缩点. 缩点以后找强连通分量,缩点,然后当图有且仅有1个出度为1的点时,有答案. Cod ...

  8. bzoj 1051 [HAOI2006]受欢迎的牛(tarjan缩点)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1051 题解:缩点之后判断出度为0的有几个,只有一个那么输出那个强连通块的点数,否者 ...

  9. 【BZOJ 1051】 1051: [HAOI2006]受欢迎的牛 (SCC)

    1051: [HAOI2006]受欢迎的牛 Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如 ...

随机推荐

  1. cocos2d-x游戏循环与调度

    每一个游戏程序都有一个循环在不断运行,它是有导演对象来管理很维护.如果需要场景中的精灵运动起来,我们可以在游戏循环中使用定时器(Scheduler)对精灵等对象的运行进行调度.因为Node类封装了Sc ...

  2. 移动端边框1px的实现

    查看京东的移动端1px实现原理,用的是:after和css3的scale(0.5)缩放. border-right fr:after{ height:100%; content:' '; width: ...

  3. 推荐5个应用 jQuery 特效的精美特效

    1.jQuery歌词同步的音乐播放器插件 精巧实用 之前我们分享过很多音乐播放器和视频播放器,很多播放器的UI界面都非常酷,特别是利用HTML5和CSS3实现的一些动画特效.今天要分享的一款基于jQu ...

  4. Java中注解Annotation的定义、使用、解析

    此例子,用于说明如何在Java中对“注解 Annotation”的定义.使用和解析的操作.注解一般用于自定义开发框架中,至于为什么使用,此处不作过多说明,这里只说明如何使用,以作备记.下面例子已测试, ...

  5. 跨frame操作dom元素

    今天,一群友问到跨frame操作dom元素的问题.于是写了个demo,在此发表在博客里面,供其他同道中人参考! 创建child.html内容如下: <!DOCTYPE HTML PUBLIC & ...

  6. Linux下编译安装mysql-5.0.45.tar.gz

    安装环境:VMware9(桥接模式) + Linux bogon 2.6.32-642.3.1.el6.x86_64(查看linux版本信息:uname -a) 先给出MySQL For Linux ...

  7. CentOS 7 用户账户配置

    说明: 1.这篇博文记录的是CentOS 7 用户账户的配置,包括添加用户.添加用户组.删除用户.删除用户组等.其中包括分析用户的配置文件.目录以及对安全的思考. 2.用户配置方面CentOS 7与以 ...

  8. CSS1-CSS3 <color>颜色知识知多少?

    非本人原创,原文转载自http://www.zhangxinxu.com/wordpress/2015/07/know-css1-css3-color/ by zhangxinxu from http ...

  9. 用canvas 绘制的饼状统计图、柱状统计图、折线统计图

    canvas 绘制的饼状统计图 canvas 绘制的柱状统计图 canvas 绘制的折线统计图

  10. C# 条码标签打印程序,RDLC报表动态显示多条码标签的方法

    初学c#,因最近公司客户要求原出货标签需实现条码化,练手的机会来了,遂动手做这个程序,开始都是一些增删改查操作一直很顺利,但到RDLC报表将条码显示到报表上犯难了,因为初学未接触过报表,上网查资料均一 ...