2208: [Jsoi2010]连通数

Time Limit: 20 Sec

Memory Limit: 256 MB

题目连接

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

Description

Input

输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。

Output

输出一行一个整数,表示该图的连通数。

Sample Input

3
010
001
100

Sample Output

9

HINT

对于100%的数据,N不超过2000。

题意

题解

先缩点,变成一个有向无环图之后,再直接跑dp就好了

可以用bitset做

代码:

  1. //qscqesze
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <ctime>
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <set>
  9. #include <bitset>
  10. #include <vector>
  11. #include <sstream>
  12. #include <queue>
  13. #include <typeinfo>
  14. #include <fstream>
  15. #include <map>
  16. #include <stack>
  17. typedef long long ll;
  18. using namespace std;
  19. //freopen("D.in","r",stdin);
  20. //freopen("D.out","w",stdout);
  21. #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
  22. #define maxn 200051
  23. #define mod 10007
  24. #define eps 1e-9
  25. int Num;
  26. //const int inf=0x7fffffff; //нчоч╢С
  27. const int inf=0x3f3f3f3f;
  28. inline ll read()
  29. {
  30. ll x=,f=;char ch=getchar();
  31. while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
  32. while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  33. return x*f;
  34. }
  35. //**************************************************************************************
  36.  
  37. vector<int> Q[maxn];
  38. char s[];
  39. int dfn[],low[],_clock=;
  40. int sta[],top;
  41. bool in_sta[];
  42. int changed[],scc,num[];
  43. bitset<> have[];
  44. void tarjan(int x)
  45. {
  46. dfn[x]=low[x]=++_clock;
  47. sta[++top]=x;
  48. in_sta[x]=;
  49. for(int i=;i<Q[x].size();i++)
  50. {
  51. int v = Q[x][i];
  52. if(!dfn[v])
  53. tarjan(v),low[x]=min(low[x],low[v]);
  54. else if(in_sta[v])
  55. low[x]=min(low[x],dfn[v]);
  56. }
  57. if(dfn[x]==low[x])
  58. {
  59. int temp;
  60. ++scc;
  61. do{
  62. temp = sta[top--];
  63. in_sta[temp]=;
  64. changed[temp]=scc;
  65. ++num[scc];
  66. }while(temp!=x);
  67. }
  68. }
  69. int main()
  70. {
  71. int n=read();
  72. for(int i=;i<=n;i++)
  73. {
  74. scanf("%s",s+);
  75. for(int j=;j<=n;j++)
  76. {
  77. if(s[j]=='')
  78. Q[i].push_back(j);
  79. }
  80. }
  81. for(int i=;i<=n;i++)
  82. if(!dfn[i])tarjan(i);
  83. for(int i=;i<=n;i++)
  84. have[changed[i]][i]=;
  85. int ans=;
  86. for(int i=;i<=scc;i++)
  87. {
  88. ans+=num[i]*num[i];
  89. bitset<>temp;
  90. for(int x = ;x<=n;x++)
  91. {
  92. if(changed[x]==i)
  93. {
  94. for(int j=;j<Q[x].size();j++)
  95. {
  96. int v = Q[x][j];
  97. if(changed[v]!=i)
  98. temp|=have[changed[v]];
  99. }
  100. }
  101. }
  102. ans+=num[i]*temp.count();
  103. have[i]|=temp;
  104.  
  105. }
  106. printf("%d\n",ans);
  107. }

BZOJ 2208: [Jsoi2010]连通数 tarjan bitset的更多相关文章

  1. BZOJ 2208 JSOI2010 连通数 Tarjan+拓扑排序

    题目大意:给定一个n个点的有向图,求有多少点对(x,y),使x沿边可到达y 设f[i][j]为从i到j是否可达 首先强联通分量中的随意两个点均可达 于是我们利用Tarjan缩点 缩点之后是一个拓扑图. ...

  2. bzoj 2208 [Jsoi2010]连通数

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Description Input 输入数据第一行是图顶点的数量,一个正整数N ...

  3. BZOJ 2208: [Jsoi2010]连通数( DFS )

    n只有2000,直接DFS就可以过了... -------------------------------------------------------------------------- #in ...

  4. BZOJ.2208.[JSOI2010]连通数(bitset Tarjan 拓扑)

    题目链接 先缩点,对于scc之间贡献即为szscc[i]*szscc[j] 用f[i][j]表示scci是否能到sccj 拓扑排序,每次把now的f或上to的f 用bitset优化 //63888kb ...

  5. bzoj 2208: [Jsoi2010]连通数【tarjan+拓扑+dp】

    我总觉得枚举点bfs也行-- tarjan缩点,记一下每个scc的size,bitset压一下scc里的点,然后按拓扑倒序向上合并到达状态,然后加ans的时候记得乘size #include<i ...

  6. BZOJ2208: [Jsoi2010]连通数(tarjan bitset floyd)

    题意 题目链接 Sol 数据水的一批,\(O(n^3)\)暴力可过 实际上只要bitset优化一下floyd复杂度就是对的了(\(O(\frac{n^3}{32})\)) 还可以缩点之后bitset维 ...

  7. 2208: [Jsoi2010]连通数

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1371  Solved: 557[Submit][Status ...

  8. 2208: [Jsoi2010]连通数 - BZOJ

    Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示无边. Output 输出一行一个整数,表示该图 ...

  9. 【BZOJ】2208 [Jsoi2010]连通数

    [题意]给定n个点的有向图,求可达点对数(互相可达算两对,含自身).n<=2000. [算法]强连通分量(tarjan)+拓扑排序+状态压缩(bitset) [题解]这题可以说非常经典了. 1. ...

随机推荐

  1. HTML5实现扫描识别二维码/生成二维码

    扫描识别二维码 思路: 1. 操作摄像头,获取图片.HTML5 WEBRTC的navigator.getUserMedia方法去实时获取摄像头资源.  2. 利用canvas使用相关算法分析图片识别图 ...

  2. [Everyday Mathematics]20150209

    设 $f$ 在区间 $I$ 上三阶可导, $f'\neq 0$, 则可定义 $f$ 的 Schwarz 导数: $$\bex S(f,x)=\frac{f'''(x)}{f'(x)}-\frac{3} ...

  3. Android访问权限大全

    android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问”properties”表在checkin数据库中,改值可以修改上传( Allows read/w ...

  4. 22、TTS技术

    Android对TTS技术的支持 Android 1.6开始支持TTS(Text To Speech)技术,通过该技术可以将文本转换成语音. TTS技术的核心是android.speech.tts.T ...

  5. http://blog.csdn.net/jbb0403/article/details/42102527

    http://blog.csdn.net/jbb0403/article/details/42102527

  6. BestCoder Round #75 解题报告

    King's Cake [思路] 递推 公式:f(n,m)=f(max(m,n-m),min(m,n-m))+1,n>m [代码] #include<cstdio> #include ...

  7. 瞬间从IT屌丝变大神——注释规则

    注释的主要规则如下: 公共组件和各栏目的维护者都需要在文件头部加上注释说明: /** *文件用途说明 *作者姓名 *联系方式*制作日期 **/ 大的模块注释方法: //======= //代码用途 / ...

  8. document.write("\x3c\x54")?是加密了吗?

    <script>document.writeln("\x3C\x73\x63\x72\x69\x70\x74\x20\x73\x72\x63\x3D\x22\x48\x54\x5 ...

  9. json字符串转换为JSONObject和JSONArray

    一.下载json 具体到http://www.json.org/上找java-json下载,并把其放到项目源代码中,这样就可以引用其类对象了 二.具体转化过程 //JSONObject String ...

  10. Codeforces 602B Approximating a Constant Range(想法题)

    B. Approximating a Constant Range When Xellos was doing a practice course in university, he once had ...