我总觉得枚举点bfs也行……

tarjan缩点,记一下每个scc的size,bitset压一下scc里的点,然后按拓扑倒序向上合并到达状态,然后加ans的时候记得乘size

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<vector>
  5. #include<queue>
  6. #include<bitset>
  7. using namespace std;
  8. const int N=2005;
  9. int n,h[N],cnt,dfn[N],low[N],tot,s[N],top,bl[N],col,d[N],a[N],ans,si[N];
  10. bool v[N];
  11. char c[N];
  12. bitset<N>f[N];
  13. vector<pair<int,int> >b;
  14. struct qwe
  15. {
  16. int ne,no,to;
  17. }e[N*N];
  18. void add(int u,int v)
  19. {
  20. cnt++;
  21. e[cnt].ne=h[u];
  22. e[cnt].no=u;
  23. e[cnt].to=v;
  24. h[u]=cnt;
  25. }
  26. void tarjan(int u)
  27. {
  28. dfn[u]=low[u]=++tot;
  29. v[s[++top]=u]=1;
  30. for(int i=h[u];i;i=e[i].ne)
  31. {
  32. if(!dfn[e[i].to])
  33. {
  34. tarjan(e[i].to);
  35. low[u]=min(low[u],low[e[i].to]);
  36. }
  37. else if(v[e[i].to])
  38. low[u]=min(low[u],dfn[e[i].to]);
  39. }
  40. if(dfn[u]==low[u])
  41. {
  42. col++;
  43. while(s[top]!=u)
  44. {
  45. bl[s[top]]=col;
  46. si[col]++;
  47. v[s[top--]]=0;
  48. }
  49. bl[s[top]]=col;
  50. si[col]++;
  51. v[s[top--]]=0;
  52. }
  53. }
  54. int main()
  55. {
  56. scanf("%d",&n);
  57. for(int i=1;i<=n;i++)
  58. {
  59. scanf("%s",c+1);
  60. for(int j=1;j<=n;j++)
  61. if(c[j]=='1')
  62. add(i,j);
  63. }
  64. for(int i=1;i<=n;i++)
  65. if(!dfn[i])
  66. tarjan(i);
  67. for(int i=1;i<=n;i++)
  68. f[bl[i]][i]=1;
  69. for(int i=1;i<=cnt;i++)
  70. if(bl[e[i].no]!=bl[e[i].to])
  71. b.push_back(make_pair(bl[e[i].no],bl[e[i].to]));
  72. memset(h,0,sizeof(h));
  73. cnt=0;
  74. for(int i=0,len=b.size();i<len;i++)
  75. add(b[i].first,b[i].second),d[b[i].second]++;
  76. tot=0;
  77. queue<int>q;
  78. for(int i=1;i<=col;i++)
  79. if(!d[i])
  80. q.push(i);
  81. while(!q.empty())
  82. {
  83. int u=q.front();
  84. q.pop();
  85. a[++tot]=u;
  86. for(int i=h[u];i;i=e[i].ne)
  87. if(!(--d[e[i].to]))
  88. q.push(e[i].to);
  89. }
  90. for(int i=tot;i>=1;i--)
  91. {
  92. for(int j=h[a[i]];j;j=e[j].ne)
  93. f[a[i]]|=f[e[j].to];
  94. ans+=f[a[i]].count()*si[a[i]];
  95. }
  96. printf("%d\n",ans);
  97. return 0;
  98. }

bzoj 2208: [Jsoi2010]连通数【tarjan+拓扑+dp】的更多相关文章

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

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

  2. BZOJ 2208: [Jsoi2010]连通数 tarjan bitset

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

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

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

  4. bzoj 2208 [Jsoi2010]连通数

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

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

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

  6. 2208: [Jsoi2010]连通数

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

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

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

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

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

  9. [模板][Luogu3387] 缩点 - Tarjan, 拓扑+DP

    Description 给定一个n个点m条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大.你只需要求出这个权值和. 允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次 ...

随机推荐

  1. msp430项目编程

    msp430中项目---LED数码管显示 1.数码管介绍 2.代码(直接使用引脚驱动) 3.代码(使用译码器驱动) 4.项目总结 msp430项目编程 msp430入门学习

  2. json解析bug之ERROR ExceptionController:185 - not close json text, token : :

    错误:ERROR ExceptionController:185 - not close json text, token : : 原因:json数据格式有误.!我的错误是,缺少了一个包括json数据 ...

  3. 为什么不建议用Table布局

    Tables的缺点 1.Table要比其它html标记占很多其它的字节.(延迟下载时间.占用server很多其它的流量资源.) 2.Tablle会阻挡浏览器渲染引擎的渲染顺序.(会延迟页面的生成速度, ...

  4. 使用mongostat监视mongodb

    1, 监视一个mongod mongostat 10.80.1.1:27018 1,监视replica set mongostat --host rs0/10.80.1.1:27018,10.80.1 ...

  5. oracle授权、表备份、用户管理

    用户管理 创建用户: create user 用户名 identified by 密码; 修改用户密码: alter user 用户名 identified by 密码; 激活用户: alter us ...

  6. 【Jquery】jQuery获取URL參数的两种方法

    jQuery获取URL參数的关键是获取到URL,然后对URL进行过滤处理,取出參数. location.href是取得URL.location.search是取得URL"?"之后的 ...

  7. ACdream原创群赛(13)のwuyiqi退役专场 C True love

    True love Time Limit: 4000/2000 MS (Java/Others)     Memory Limit:128000/64000 KB (Java/Others) Prob ...

  8. Android开发之自己定义Spinner样式的效果实现(源码实现)

    android系统自带的Spinner样式是远远满足不了我们实际开发过程中对Spinner UI风格的要求,因此我们肯定须要为了切合整个应用的风格,改动我们的Spinner样式.系统给我们提供了两种常 ...

  9. Ubuntu16.04 下python2 | python3

    在终端分别输入python,python2,python3 python和python2默认都是python2 python3才是python3 Ubuntu下是默认没有pip的,需要自己手动安装 s ...

  10. (WPF)附加属性

    <Window x:Class="DeepXAML.MainWindow" xmlns="http://schemas.microsoft.com/winfx/20 ...