原题:ZOJ 3795 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3795

题目大意:给定一个有向图,要求把点分为k个集合,使得每个集合中的任意两点a, b满足a, b互相不可到达。

分析:求出强连通分量后缩点,得到有向无环图,dfs该图求出各点深度(深度加权,权值为强连通分量大小),深度最大值即答案,

因为这一条路径上任意两点都可从深度小的一点到达深度大的一点,所以任意两点必定属于不同集合,即每个点一个集合;求的最大深度集合后,又可以把其它路径(长度为len)上的各点依次归到集合1..len。

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <vector>
  7. #include <queue>
  8. #include <stack>
  9. #define Mod 1000000009
  10. using namespace std;
  11. #define N 100007
  12.  
  13. vector<int> G[N],G2[N];
  14. stack<int> stk;
  15. int instk[N],cnt,Time,n,m,dep[N];
  16. int low[N],dfn[N],bel[N],num[N];
  17.  
  18. void tarjan(int u)
  19. {
  20. low[u] = dfn[u] = ++Time;
  21. stk.push(u);
  22. instk[u] = ;
  23. for(int i=;i<G[u].size();i++)
  24. {
  25. int v = G[u][i];
  26. if(!dfn[v])
  27. {
  28. tarjan(v);
  29. low[u] = min(low[u],low[v]);
  30. }
  31. else if(instk[v])
  32. low[u] = min(low[u],dfn[v]);
  33. }
  34. if(low[u] == dfn[u])
  35. {
  36. cnt++;
  37. int v;
  38. do
  39. {
  40. v = stk.top();
  41. stk.pop();
  42. instk[v] = ;
  43. bel[v] = cnt;
  44. num[cnt]++;
  45. }while(u != v);
  46. }
  47. }
  48.  
  49. void Tarjan()
  50. {
  51. memset(bel,,sizeof(bel));
  52. memset(instk,,sizeof(instk));
  53. memset(dfn,,sizeof(dfn));
  54. memset(low,,sizeof(low));
  55. memset(num,,sizeof(num));
  56. Time = cnt = ;
  57. while(!stk.empty())
  58. stk.pop();
  59. for(int i=;i<=n;i++)
  60. if(!dfn[i])
  61. tarjan(i);
  62. }
  63.  
  64. void Build()
  65. {
  66. int i,j;
  67. for(i=;i<=cnt;i++)
  68. G2[i].clear();
  69. for(i=;i<=n;i++)
  70. {
  71. for(j=;j<G[i].size();j++)
  72. {
  73. int v = G[i][j];
  74. if(bel[i] != bel[v])
  75. G2[bel[i]].push_back(bel[v]);
  76. }
  77. }
  78. }
  79.  
  80. int dfs(int u)
  81. {
  82. if(dep[u])
  83. return dep[u];
  84. for(int i=;i<G2[u].size();i++)
  85. {
  86. int v = G2[u][i];
  87. dep[u] = max(dep[u],dfs(v));
  88. }
  89. dep[u] += num[u];
  90. return dep[u];
  91. }
  92.  
  93. int main()
  94. {
  95. int i,j,u,v;
  96. while(scanf("%d%d",&n,&m)!=EOF)
  97. {
  98. for(i=;i<=n;i++)
  99. G[i].clear();
  100. for(i=;i<m;i++)
  101. {
  102. scanf("%d%d",&u,&v);
  103. G[u].push_back(v);
  104. }
  105. Tarjan();
  106. Build();
  107. memset(dep,,sizeof(dep));
  108. int res = ;
  109. for(i=;i<=n;i++)
  110. res = max(res,dfs(i));
  111. printf("%d\n",res);
  112. }
  113. return ;
  114. }

2014 Super Training #8 G Grouping --Tarjan求强连通分量的更多相关文章

  1. UESTC 901 方老师抢银行 --Tarjan求强连通分量

    思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...

  2. tarjan求强连通分量+缩点+割点以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  3. tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  4. HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题

    Summer Holiday Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  5. UVALive 4262——Trip Planning——————【Tarjan 求强连通分量个数】

    Road Networks Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Stat ...

  6. Tarjan求强连通分量,缩点,割点

    Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...

  7. CCF 高速公路 tarjan求强连通分量

    问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...

  8. tarjan求强连通分量(模板)

    https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...

  9. Tarjan求强连通分量、求桥和割点模板

    Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...

随机推荐

  1. maven oracle jdbc jar

    1.problem describe: when your dependency jar about oracle use code like this: <!-- oracle-connect ...

  2. 使用Apache ab进行压力测试(参数说明)

    我们一般会使用Apache自带的ab来对项目进行压力测试,看项目的执行情况如何. 我们可以使用 ab -v 来查看ab的详细参数使用方法. [root@node234 bin]# ./ab -v ab ...

  3. java调用html模板发送html内容的邮件

    在项目需要发送邮件,普通内容的邮件觉得太单调.太丑,没逼格,所以说直接把用到的邮件内容做成一个html模板,发送之前将对应参数替换掉,发送html内容的高逼格邮件. 首先需要引用jar包,这就不多说了 ...

  4. 再议使用Python批量裁切栅格

    曾经写过<使用Python脚本批量裁切栅格>,但今天又遇到这个情况则发现了问题.我们遇到的实际问题往往是有一个需要裁剪的影像(大块的),另外有一个矢量面,现在需要按矢量面每一个要素进行裁剪 ...

  5. Button 对 TreeView1 所有节点的全选

    protected void Button1_Click(object sender, EventArgs e)    {        for (int i = 0; i < this.Tre ...

  6. mysql innoDB 挂了的临时解决方案

    Mysql InnoDB: Error: checksum mismatch by Mattias Hemmingsson on December 23, 2013 in Linux • 6 Comm ...

  7. Java使用正则表达式获取文本的章节名称

    获取文本的章节,首先要确定章节的开始标准,一般中文的章节都是以“第”开头,第一章.第二章等.所以使用“^”字符来确定首位,但是很多时候章节前面会有空白字符,所有以“第”作为章节的开始,进行以下的匹配 ...

  8. UITableView删除添加和移动

    #import "RootTableViewController.h" @interface RootTableViewController () @property (nonat ...

  9. Android官方多媒体API Mediacodec翻译(一)

    因近期工作调整,关于Mediacodec部分的翻译会暂停,后续有时间一定补上,非常抱歉. 本文章为根据Android Mediacodec官方英文版的原创翻译,转载请注明出处:http://www.c ...

  10. iOS 中 CAShapeLayer 的使用( 等待删除的博文)

    等待删除. 1.CAShapeLayer 简介 1.CAShapeLayer继承至CALayer,可以使用CALayer的所有属性值 2.CAShapeLayer需要与贝塞尔曲线配合使用才有意义 3. ...