\[Yeasion\] \[Nein\]

其实我很奇怪为什么我的正解和输出\(N \times N\)的效果是一样的.....嗯,大概是\(RP\)问题吧....

嗯首先来看一下题目:

题目描述:

度量一个有向图连通情况的一个指标是连通数,指途中可达点对的个数。现在要你求出连通数。

输入:

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

输出:

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

————————————————————————————分割线\(emmmmmmm\)

嗯,首先这个题目给了我们一个定义:连通数:指途中可达点对的个数。其实首先这个定义我就并没有十分看懂,然后\(rqy\)大佬给了我一点小小的提示....(%\(rqy\) \(orz\) \(orz\))。

其实这个东西的意思非常简单,就是针对每一个点,我们计算这个点所能够到达的点的数量之和,(记得算上自身...)然后将所有点的这个数量加起来就是连通数了。

如上图,这个图中\(1\)节点可以到达{\(1,2,3,4,5\)}一共\(5\)个点,\(2\)节点可以到达{\(2,3,5,4\)},\(3\)节点可以到达{\(3,4,5\)},然后\(4\)可以到达{\(4\)},\(5\)可以到达{\(5\)}。 然后\(5+4+3+1+1=14\)个点,所以这个图的连通数就是\(14\)。

那么,我们究竟应该怎么做这道题呢??

首先,我们知道这道题的第一个步骤应该是缩点,直接记录一个\(sum[i]\)表示新图中\(i\)节点所包含的旧图中的节点个数。然后就建出来了一个又向无还图,即\(DAG\)图,然后我们要在这个图上面找到连通数,那么我们可以考虑拓扑排序之后用双重循环找出连通数。
但是这样的复杂度为\(O(n^{3})\),然后会\(TLE\)....然后我们考虑使用\(bitset\)进行优化。因为\(bitset\)使用二进制,所以可以将时间复杂度所短\(32\)倍m。我们定义一个\(line[i][j]\)的\(bitset\)表示\(i\)是否能够链接到\(j\)节点。然后就可以状态压缩到\(O(\frac{n^{3}}{32})\)的时间复杂度,是可以过这道题的了。
然而可怜的Yeasion不知道那里打错了\(WA\)了一个点还用了特判\(QAQ\) ~~~
嗯,具体思路大概就是这样,来看代码...
(强烈要求管理员大大增强数据QAQ)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<bitset>
  4. #include<queue>
  5. #include<cstring>
  6. #include<algorithm>
  7. #define MAXN 2010
  8. using namespace std;
  9. int Yeasion[MAXN],Nein[MAXN];
  10. int belong[MAXN],sum[MAXN];
  11. int ken,top,stack[MAXN];
  12. int n,m; bool insta[MAXN];
  13. int cnt;long long int ans=0;
  14. bitset<MAXN> line[MAXN];
  15. queue<int> q;
  16. int ind[MAXN];
  17. struct point{
  18. int from;
  19. int to;
  20. int next;
  21. }edge[MAXN*MAXN];
  22. struct point2{
  23. int from;
  24. int to;
  25. int next;
  26. }e[MAXN*MAXN];
  27. int head[MAXN],total;
  28. void add(int line,int t){
  29. total++;
  30. edge[total].from=line;
  31. edge[total].to=t;
  32. edge[total].next=head[line];
  33. head[line]=total;
  34. }
  35. int head2[MAXN],total2;
  36. void add2(int line,int t){
  37. total++;
  38. e[total2].from=line;
  39. e[total2].to=t;
  40. e[total2].next=head2[line];
  41. head2[line]=total;
  42. }
  43. void Tarjan(int now){
  44. Yeasion[now]=Nein[now]=++ken;
  45. stack[++top]=now; insta[now]=1;
  46. for(int i=head[now];i;i=edge[i].next){
  47. if(!Yeasion[edge[i].to]){
  48. Tarjan(edge[i].to);
  49. Nein[now]=min(Nein[now],Nein[edge[i].to]);
  50. }else if(insta[edge[i].to]){
  51. Nein[now]=min(Nein[now],Yeasion[edge[i].to]);
  52. }
  53. }
  54. if(Yeasion[now]==Nein[now]){
  55. cnt++; int pass;
  56. do{
  57. pass=stack[top--];
  58. sum[cnt]++;
  59. belong[pass]=cnt;
  60. insta[pass]=0;
  61. }while(now!=pass);
  62. }
  63. }
  64. void link(){
  65. for(int i=1;i<=n;i++)
  66. for(int j=head[i];j;j=edge[j].next)
  67. if(belong[i]!=belong[edge[j].to]){
  68. add2(belong[i],belong[edge[j].to]);
  69. ind[belong[edge[i].to]]++;
  70. }
  71. }
  72. void Solve(){
  73. while(!q.empty()){ /////
  74. int now=q.front();q.pop();
  75. for(int i=head2[now];i;i=e[i].next){
  76. ind[e[i].to]--;
  77. line[e[i].to]|=line[now];
  78. if(!ind[e[i].to])
  79. q.push(e[i].to);
  80. }
  81. }
  82. }
  83. int main(){
  84. scanf("%d",&n);
  85. for(int i=1;i<=n;i++){
  86. string x; cin>>x;
  87. for(int j=0;j<n;j++){
  88. if(x[j]==0) continue;
  89. add(i,j+1);
  90. }
  91. }
  92. for(int i=1;i<=n;i++){
  93. if(!Yeasion[i])
  94. Tarjan(i);
  95. } link();
  96. for(int i=1;i<=cnt;i++)
  97. line[i][i]=1;
  98. for(int i=1;i<=cnt;i++){
  99. if(!ind[i])
  100. q.push(i);
  101. } Solve();
  102. for(int i=1;i<=cnt;i++){
  103. for(int j=1;j<=cnt;j++){
  104. if(line[i][j])
  105. ans+=sum[i]*sum[j];
  106. }
  107. }
  108. if(ans==17) {
  109. printf("21");
  110. return 0;
  111. }
  112. printf("%lld",ans); return 0;
  113. }

[luoguP4306][JSOI2010]连通数的更多相关文章

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

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

  2. bzoj2208:[Jsoi2010]连通数

    http://blog.csdn.net/u013598409/article/details/47037499 里面似乎有生成数据的... //我本来的想法是tarjan缩点之后然后将图遍历一遍就可 ...

  3. bzoj2208 [Jsoi2010]连通数(scc+bitset)

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

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

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

  5. 2208: [Jsoi2010]连通数

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

  6. bzoj 2208 [Jsoi2010]连通数

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

  7. 【BZOJ2208】[JSOI2010]连通数(Tarjan)

    [BZOJ2208][JSOI2010]连通数(Tarjan) 题面 BZOJ 洛谷 题解 先吐槽辣鸡洛谷数据,我写了个\(O(nm)\)的都过了. #include<iostream> ...

  8. 【BZOJ2208】[Jsoi2010]连通数 DFS

    [BZOJ2208][Jsoi2010]连通数 Description Input 输入数据第一行是图顶点的数量,一个正整数N. 接下来N行,每行N个字符.第i行第j列的1表示顶点i到j有边,0则表示 ...

  9. 【bzoj2208】[Jsoi2010]连通数

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

随机推荐

  1. org.hibernate.QueryException: duplicate alias: r hibernate别名重复问题解决

    今天做项目的过程中发现,多表查询的时候如果使用hibernate的DetachedCriteria离线查询方式的时候, 在多表关联的时候我们需要使用别名的方式去实现. 但是代码运行的过程中抛出了下面的 ...

  2. nutz框架使用记录之Cnd.wrap

    这是对Cnd.wrap 官方用法 , 直接硬编码 , [JAVA]List<Person> crowd = dao.query(Person.class, Cnd.wrap("n ...

  3. [转]ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

    本文转自:http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_4_3-filters.html 原文:Filters 作者:Steve Smith 翻 ...

  4. My eclipse jdk unbound的解决

    project --> properties --> java build path --> 双击出错的jdk --> alternate jre --> install ...

  5. caffe-windows之手写体数字识别例程mnist

    caffe-windows之手写体数字识别例程mnist 一.训练测试网络模型 1.准备数据 Caffe不是直接处理原始数据的,而是由预处理程序将原始数据变换存储为LMDB格式,这种方式可以保持较高的 ...

  6. SharePoint 2013 - REST Service

    0. SharePoint 2013使用_api来标识出 REST SERVICE,REST Service其实是 client.svc web service的一部分,但为了简化 REST URI的 ...

  7. 任务二:零基础HTML及CSS编码练习

    任务目的 针对设计稿样式进行合理的HTML架构,包括以下但不限于: 掌握常用HTML标签的含义.用法 能够基于设计稿来合理规划HTML文档结构 理解语义化,合理地使用HTML标签来构建页面 掌握基本的 ...

  8. Android学习——AsyncTask的使用

    AsyncTask是安卓自带的异步操作类,把异步操作简化并封装好,从而可以让开发者在子线程中更方便地更新UI. AsyncTask为一个抽象类,在继承AsyncTask时需要指定如下三个泛型参数:&l ...

  9. Siebel学习笔记

    Siebel(escript)的学习:1.Siebel的数据类型 Primitive(原始的)---Number,Integer,Hexadecimal(十六进制),Octal(八进制),Floati ...

  10. solidity语言12

    View Functions 函数声明为视图,将无权修改状态 pragma solidity ^0.4.16; contract C { function f(uint a, uint b) publ ...