题目链接

先是强连通分量缩点,然后出来一个DAG

然后就可以DP啦,要找出每个SCC能到达的SCC有哪些

如果直接存一个二维数组来传递闭包的话肯定会TLE对吧

于是我们使用了神奇的bitset就快多了

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<iostream>
 4 #include<bitset>
 5 #include<set>
 6 #include<map>
 7 #include<queue>
 8 #include<stack>
 9 #include<cmath>
10 #include<algorithm>
11 #include<string>
12 #include<string>
13 #define re(i,l,r) for(int i=(l);i<=(r);i++)
14 #define rre(i,l,r) for(int i=(l);i>=(r);i--)
15 using namespace std;
16 void inin(int &x)
17 {
18     x=0;int f=0;char ch=getchar();
19     while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
20     while(ch>='0'&&ch<='9')x*=10,x+=ch-'0',ch=getchar();
21     x=f?-x:x;
22 }
23 int head[2020],next[4000040],zhi[4000040],s[2020];
24 int head2[2020],next2[4000040],zhi2[4000040];
25 int low[2020],dfn[2020],sccno[20020],tot,sum,ed;
26 void add(int a,int b)
27 {
28     next[++ed]=head[a],head[a]=ed,zhi[ed]=b;
29 }
30 int r[2020];
31 void add2(int a,int b)
32 {
33     next2[++ed]=head2[a],head2[a]=ed,zhi2[ed]=b,r[b]++;
34 }
35 stack<int>h;
36 void dfs(int u)
37 {
38     dfn[u]=low[u]=++tot;
39     h.push(u);
40     for(int i=head[u];i;i=next[i])
41     {
42         int v=zhi[i];
43         if(!dfn[v])dfs(v),low[u]=min(low[u],low[v]);
44         else if(!sccno[v])low[u]=min(low[u],dfn[v]);
45     }
46     if(low[u]==dfn[u])
47     {
48         sum++;
49         while(1)
50         {
51             int x=h.top();h.pop();
52             sccno[x]=sum;
53             s[sum]++;
54             if(x==u)break;
55         }
56     }
57 }
58 int n,mm[2020][2020];
59 void rebuild()
60 {
61     ed=0;
62     re(i,1,n)for(int j=head[i];j;j=next[j])
63         if(sccno[i]!=sccno[zhi[j]]&&!mm[sccno[i]][sccno[zhi[j]]])
64             add2(sccno[i],sccno[zhi[j]]),mm[sccno[i]][sccno[zhi[j]]]=1;
65 }
66 queue<int>hh;
67 bitset<2020> dp[2020];
68 int main()
69 {
70     freopen("in.in","r",stdin);
71     freopen("out.out","w",stdout);
72     inin(n);
73     char ss[2020];
74     re(i,1,n)
75     {
76         scanf("%s",ss+1);
77         re(j,1,n)if(ss[j]=='1')add(i,j);
78     }
79     re(i,1,n)if(!dfn[i])dfs(i);
80     rebuild();int ans=0;
81     re(i,1,sum){if(!r[i])hh.push(i);dp[i][i]=1;}
82     while(!hh.empty())
83     {
84         int x=hh.front();hh.pop();
85         for(int i=head2[x];i;i=next2[i])
86         {
87             r[zhi2[i]]--;dp[zhi2[i]]|=dp[x];
88             if(!r[zhi2[i]])hh.push(zhi2[i]);
89         }
90     }
91     re(i,1,sum)
92     {
93         int u=0;
94         re(j,1,sum)if(dp[i][j]==1)u+=s[j];
95         ans+=s[i]*u;
96     }
97     printf( "%d\n",ans);
98     return 0;
99 }

转载于:https://www.cnblogs.com/HugeGun/p/5176225.html

bzoj2208 [Jsoi2010]连通数相关推荐

  1. BZOJ2208 [Jsoi2010]连通数

    题目描述: 度量一个有向图连通情况的一个指标是连通,指途中可达点对的个数. 下图的连通数是14 现在要你求出连通数 n<=2000 题解: 网上的题解有的写得很复杂,但是看到n的范围这么小,当然 ...

  2. [bzoj2208][Jsoi2010]连通数

    一道传递闭包裸题.tarjan+拓扑dp也很强而且貌似更快.本来想写的. 然而查题解的时候发现一个博主的一句话引起了我的共鸣. bzoj上这道题rank前面都是1500B+的大佬,很快,几百ms,到了 ...

  3. [BZOJ2208]:[Jsoi2010]连通数(暴力 or bitset or 塔尖?)

    题目传送门 题目描述 度量一个有向图连通情况的一个指标是连通数,指图中可达顶点对的个数. 在上图中,顶点1可以到达1.2.3.4.5. 顶点2可以到达2.3.4.5. 顶点3可以到达3.4.5. 顶点 ...

  4. bzoj2208: [Jsoi2010]连通数

    补写. 学了学用bitset优化floyd,做这题比用强联通缩点+DP方便多了. bitset具体就是一串编码,比如说定义bitset<2100>b,b就是一个2100位的01串. 由于位 ...

  5. bzoj2208 [Jsoi2010]连通数 强连通分量缩点+拓扑排序+bitset

    Description 对于100%的数据,N不超过2000. Solution 容易想到要tarjan缩点按拓扑序递推,但是去重的步骤不好弄 C++STL中有bitset,用这个当成二进制按位状压即 ...

  6. bzoj2208:[Jsoi2010]连通数

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

  7. 2208: [Jsoi2010]连通数

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

  8. BZOJ 2208[Jsoi2010]连通数

    题面: 2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 3100  Solved: 1347 [Submit] ...

  9. 2208: [Jsoi2010]连通数(Trajan+bitset)

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 2929  Solved: 1280 [Submit][Sta ...

最新文章

  1. 【JavaScript】请求数据时,添加时间戳,避免浏览器缓存
  2. 趣读:程序员泪流满面的20个瞬间!
  3. /proc 虚拟文件系统(实例)
  4. vue 项目文件介绍
  5. 什么是暗物质?有没有理科大神解答一下啊?
  6. 开课吧学python靠谱吗-开课吧成为CNCC中国计算机大会唯一教育合作伙伴
  7. Windows/Ubuntu 使用小技巧记录
  8. 输入阻抗和输出阻抗的理解
  9. 照片怎么转PDF格式?这两个方法快来学习下
  10. Spring(六)——声明式事物控制
  11. 张磊:什么才是企业真正的护城河
  12. pvr格式的用什么打开_cocos2d 查看pvr图片的详细格式
  13. 使用validate注解做校验以及自定义validate注解
  14. actran安装教程linux,Linux平台Actran软件安装
  15. 简单的学生成绩管理系统
  16. python皮卡丘字符打印代码,python画皮卡丘的代码
  17. 72、公安网络视频监控系统解决方案
  18. 齐岳|聚乙二醇-四氧化三铁-二氢卟吩纳米复合物Fe3O4-PEG-Ce6|肝靶向功能的四氧化三铁Fe3O4纳米粒子
  19. 电路基础知识之什么是共模电感/共模信号/差分信号?
  20. 使用计算机对炼钢过程进行,转炉炼钢计算机数采监控技术及应用

热门文章

  1. ubuntu安装sublime3并配置python3环境
  2. 计算机辅助语言和语言学关系,西方语言学与多媒体计算机辅助语言学习_王艳萍...
  3. Javascript内部类
  4. mysql中limit关键字_【JAVA】关于mysql的limit关键字使用。
  5. python运维开发_Python自动化运维开发----基础(一)
  6. mybatisplus查询今天的数据_Spring系列——MybatisPlus
  7. 深度卷积神经网络_深度卷积神经网络中的降采样
  8. java 调度etl_Easy Scheduler是一个工作流调度系统,主要解决数据研发ETL错综复杂的依赖关系...
  9. linux下升级zookeeper
  10. java使用monkeyrunner_MonkeyRunner 实践----用 java 来编写脚本