题意

题目链接

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. centos清华源地址,ubuntu阿里云源

    清华这个源挺好用,替换原先/etc/yum.repos.d/CentOS-Base.repo, 然后运行 sudo yum makecache 生成缓存 centos6 [base] name=Cen ...

  2. 将页面中表格数据导出excel格式的文件(vue)

    近期由于项目需要,需要将页面中的表格数据导出excel格式的文件,折腾了许久,在网上各种百度,虽然资料不少,但是大都不全,踩了许多坑,总算是皇天不负有心人,最后圆满解决了. 1.安装相关依赖(npm安 ...

  3. Hive在drop表的时候报错

    问题背景: 在安装完Hive之后,初始化mysql是成功的,hive启动也是成功的,也能创建database,在database中也能创建表,也能查看表结构,但是在drop的时候就不行了,在hive ...

  4. Python语法基础练习

  5. String.format(String format,Object... args)的用法

    String.format(String format, Object... args)方法详解 以前也看到过很多次这个用法,一直记不牢靠,今天整理一下.   我仅仅举几个例子稍做说明: String ...

  6. POJ 2501

    #include<iostream> #include<iomanip> #include<stdio.h> #include<string> #inc ...

  7. POJ 2492

    #include<iostream> #include<stdio.h> #define MAXN 2050 using namespace std; int pre[MAXN ...

  8. CentOS6.8 安装 Oracle11.2.0.4

    1. 安装操作系统 安装的时候选择中文+英文支持 注意分区: swap sda盘做系统盘 sdb盘做数据盘 配置完成后的服务器分区路径信息: [root@dbserver ~]# df -h File ...

  9. Xamarin Forms MVVM实现效果说明

    实体对象定义Model2  和Model均可 实现响应效果 public class BaseModel : INotifyPropertyChanged { private bool _select ...

  10. (转)AIX7.1安装Nginx 1.13的方法

    原文:https://blog.csdn.net/lvshaorong/article/details/79401860 https://blog.csdn.net/lvshaorong/articl ...