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. ubuntu鼠标突然不能使用的解决方法

    今天发现鼠标(usb即插即用)不能用了,最后发现需要接通充电才可以!!!用电池的时候居然不可以用鼠标?

  2. u-boot 源码修改 bootcmd,IP ,BOOTARGS等参数

    uboot1.1.6\include\configs\smdk6410.h #define CONFIG_BOOTCOMMAND"nand read 0xc0008000 0x200000 ...

  3. java web 学习一

    一.基本概念 1.1.WEB开发的相关知识 WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. Internet上供外界访问的Web资源分为: 静态web资源( ...

  4. [转]解决crystal report水晶报表在浏览器提示bobj未定义的错误

    网上的中文文章(比如这篇文章)都是写的部署到服务器后出现的问题,同时也指出要把crystal report的aspnet_client文件夹拷贝到对应项目的根目录里,这样就可以正常显示了,但是具体到我 ...

  5. OpenGL超级宝典第5版&&GLSL法线变换

    在GLSL中,有一些情况需要把局部坐标系下的向量或点转换到视点坐标系下,如光照计算时,需要把法向转化到视点坐标系.如果是模型上一点p 转化到视点坐标系下,直接(model-view matrix )* ...

  6. CMDB反思2

    当云灭掉CMDB http://blog.vsharing.com/xqscool/A1193910.html 虽然之前也思考过当运维底层都被替换为云时,现有的传统运维可能就消失了,其所依赖的ITIL ...

  7. MFC 解析xml文件

    CComVariant IXMLDOMElement http://blog.sina.com.cn/s/blog_69e905cd0100kp5i.html

  8. JQuery好用的日期选择控件 DatePicker

    近期发现一个很好的基于JQ的前端UI日期选择控件Jquery.DatePicker.js 下载地址:jquery.DatePIcker.js 演示地址:DatePicker - 基于jQuery 1. ...

  9. Firefox 火狐网址生成二维码扩展推荐

    该扩展并未在火狐官方的扩展站中上线,在火狐中国的站点中也几乎很难找到,只是作为火狐中国版的一个集成扩展. 各位想要使用该扩展,但又不愿安装火狐中国版的的浏览迷可以通过以下地址独立安装该扩展. 扩展地址 ...

  10. grep in linux

    1.作用linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来.grep全称是Global Regular Expression Print,表示全局正 ...