题意

题目链接

Sol

数据水的一批,\(O(n^3)\)暴力可过

实际上只要bitset优化一下floyd复杂度就是对的了(\(O(\frac{n^3}{32})\))

还可以缩点之后bitset维护一下连通性,然后对每个联通块之间的分别算,复杂度是\(O(\frac{nm}{32})\)(好像和上面的没区别。。。)

上面代码是floyed

下面的是tarjan

// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 2001;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N;
char s[MAXN];
bitset<MAXN> f[MAXN];
int main() {
N = read();
for(int i = 1; i <= N; i++) {
scanf("%s", s + 1);
for(int j = 1; j <= N; j++) f[i][j] = (s[j] == '1' || (i == j));
}
for(int k = 1; k <= N; k++)
for(int i = 1; i <= N; i++)
if(f[i][k]) f[i] = f[i] | f[k];
int ans = 0;
for(int i = 1; i <= N; i++) ans += f[i].count();
cout << ans;
return 0;;
}
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 4001;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, dfn[MAXN], low[MAXN], tot, vis[MAXN], col[MAXN], siz[MAXN], cnt, inder[MAXN];
stack<int> s;
char str[MAXN];
bitset<MAXN> f[MAXN];
vector<int> v[MAXN], E[MAXN];
void tarjan(int x) {
dfn[x] = low[x] = ++tot; vis[x] = 1; s.push(x);
for(int i = 0; i < v[x].size(); i++) {
int to = v[x][i];
if(!dfn[to]) tarjan(to), low[x] = min(low[x], low[to]);
else if(vis[to]) low[x] = min(low[x], dfn[to]);
}
if(low[x] == dfn[x]) {
int h; cnt++;
do {
h = s.top(); s.pop(); vis[h] = 0;
col[h] = cnt; siz[cnt]++;
}while(h != x);
}
}
void Topsort() {
queue<int> q;
for(int i = 1; i <= cnt; i++) {
f[i][i] = 1;
if(!inder[i]) q.push(i);
}
while(!q.empty()) {
int p = q.front(); q.pop();
for(int i = 0; i < E[p].size(); i++) {
int to = E[p][i]; f[to] |= f[p];
if(!(--inder[to])) q.push(to);
}
}
int ans = 0;
for(int i = 1; i <= cnt; i++) {
for(int j = 1; j <= cnt; j++) {
if(f[i][j]) ans += siz[i] * siz[j];
}
}
printf("%d\n", ans);
}
int main() {
N = read();
for(int i = 1; i <= N; i++) {
scanf("%s", str + 1);
for(int j = 1; j <= N; j++) if(str[j] == '1' || (i == j)) v[i].push_back(j);
}
for(int i = 1; i <= N; i++)
if(!dfn[i])
tarjan(i);
for(int i = 1; i <= N; i++) {
for(int j = 0; j < v[i].size(); j++) {
int to = v[i][j];
if(col[to] != col[i]) E[col[to]].push_back(col[i]), inder[col[i]]++;
}
}
Topsort();
return 0;;
}

BZOJ2208: [Jsoi2010]连通数(tarjan bitset floyd)的更多相关文章

  1. 2018.09.11 bzoj2208: [Jsoi2010]连通数(bitset+floyd)

    传送门 听说正解是缩点+dfs? 直接bitset优化floyd传递闭包就行了.(尽管时间复杂度是假的O(n3/32)" role="presentation" styl ...

  2. [bzoj2208][Jsoi2010]连通数_bitset_传递闭包floyd

    连通数 bzoj-2208 Jsoi-2010 题目大意:给定一个n个节点的有向图,问每个节点可以到达的点的个数和. 注释:$1\le n\le 2000$. 想法:网上有好多tarjan+拓扑序dp ...

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

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

  4. BZOJ2208 [Jsoi2010]连通数[缩点/Floyd传递闭包+bitset优化]

    显然并不能直接dfs,因为$m$会非常大,复杂度就是$O(mn)$: 这题有三种做法,都用到了bitset的优化.第二种算是一个意外的收获,之前没想到竟然还有这种神仙操作.. 方法一:缩点+DAG上b ...

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

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

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

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

  7. [BZOJ2208][Jsoi2010]连通数 暴力枚举

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

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

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

  9. BZOJ2208: [Jsoi2010]连通数

    tarjan缩点后拓扑排序,每一个点用一个bitset记录哪些点能到达它. PS:数据太水,暴力能过. #include<bits/stdc++.h> using namespace st ...

随机推荐

  1. input输入框添加内部图标

    有可能在制作网页的过程中遇到各种美化表单设计,这次我们来试着做一个demo 将input输入框添加内部图标 话不多说,看一下最终效果 我们的思路是,在一个div中,加入一个div和一个input标签, ...

  2. d3.js在vue项目中的安装及案例

    1. 安装: npm i d3 --save 2. 引入:main.js import * as d3 from "d3"; Vue.prototype.$d3 = d3; win ...

  3. python爬虫在解析不带引号的json报错的问题解决方案

    本例中环境: python3.6.6 demjson-2.2.4 如不看废话请直接看3(下面红体字) 1.近期在爬取代理验证代理的时候发生一个Bug, 就是在验证代理的时候返回的是如下字符串, {ip ...

  4. 给1~3年iOS开发 经验朋友们的一些建议(附BAT面试题)

    前言 由于笔者是做 iOS 开发的,因此本文也仅对做 iOS 的同行们有针对性,其他方向仅供参考. 1,如果你: 1~3年左右工作经验,本科,非计算机相关科班出生,学校又比较一般. 实习企业不理想没有 ...

  5. 8 Ways to Become a Better Coder

    It’s time to get serious about improving your programming skills. Let’s do it! That’s an easy career ...

  6. 再谈高性能Web服务器,MemoryPool的作用

    在以往使用c#实现scoket服务器中,通常遇到一个问题就是内存占用高,GC次数频繁,导致处理能力直线下降 其主要原因是在处理socket请求时,大量的申请,复制内存,为了解决这个问题,NET Cor ...

  7. git status的用法

    git status 用于查看工作区与暂存区的已tracked及untracked的所有文件status. 以下为help结果. git help status NAME git-status - S ...

  8. IdentityServer-Setup and Overview

    设置和概述 有两种方式创建一个IdentityServer 项目: 从零开始 使用Visual Studio的ASP.NET Identity模板 如果是从零开始,我们提供一序列的帮助及内存存储,所以 ...

  9. docker cgroup 技术之memory(首篇)

    测试环境centos7 ,内核版本4.20 内核使用cgroup对进程进行分组,并限制进程资源和对进程进行跟踪.内核通过名为cgroupfs类型的虚拟文件系统来提供cgroup功能接口.cgroup有 ...

  10. Mybatis通过GNDL语法引用静态常量或者枚举类型

    原因:mybatis 中mapper.xml 文件中需要静态常量的时候 使用: 先定义: public static String aa="aa"; ${@全路径类名称@静态变量| ...