bzoj 2208 [Jsoi2010]连通数 bitset
2017-11-08 19:28
495 查看
Description
Input
输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。
Output
输出一行一个整数,表示该图的连通数。
Sample Input
3
010
001
100
Sample Output
9
HINT
对于100%的数据,N不超过2000。
传送门
沙伯题……数据还水……
就是求个传递闭包,用floyd优化一下就好了。
看见评论里有人说dfs是O(n2)的,切记切记不是!
是O(n∗(n+m))的!而大多时候m接近于n2,
所以bitset稳健。
Input
输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。
Output
输出一行一个整数,表示该图的连通数。
Sample Input
3
010
001
100
Sample Output
9
HINT
对于100%的数据,N不超过2000。
传送门
沙伯题……数据还水……
就是求个传递闭包,用floyd优化一下就好了。
看见评论里有人说dfs是O(n2)的,切记切记不是!
是O(n∗(n+m))的!而大多时候m接近于n2,
所以bitset稳健。
#include<bits/stdc++.h> using namespace std; const int N=2005; int n; bitset<N>a ; int main(){ scanf("%d",&n); char s ; for (int i=1;i<=n;i++){ scanf("%s",s+1); for (int j=1;j<=n;j++) a[i][j]=s[j]-'0'; a[i][i]=1; } for (int k=1;k<=n;k++) for (int i=1;i<=n;i++) if (a[i][k]) a[i]|=a[k]; int ans=0; for (int i=1;i<=n;i++) ans+=a[i].count(); printf("%d\n",ans); return 0; }
相关文章推荐
- BZOJ 2208 JSOI 2010 连通数 Tarjan+bitset
- BZOJ 2208 [Jsoi2010]连通数 tarjan缩点+bitset优化DP
- [bzoj2208][Jsoi2010]连通数_bitset_传递闭包floyd
- BZOJ.2208.[JSOI2010]连通数(bitset Tarjan 拓扑)
- bzoj2208 [Jsoi2010]连通数(scc+bitset)
- [tarjan+bitset]BZOJ 2208——[Jsoi2010]连通数
- BZOJ_2208_[Jsoi2010]连通数_强连通分量+拓扑排序+手写bitset
- BZOJ 2208: [Jsoi2010]连通数 tarjan bitset
- bzoj 2208: [Jsoi2010]连通数 拓扑排序+强连通分量+bitset
- BZOJ 2208 [Jsoi2010]连通数 - Tarjan_SCC/Floyd+bitset优化
- [bzoj2208][Jsoi2010]连通数
- BZOJ 2208: [Jsoi2010]连通数
- BZOJ 2208: [Jsoi2010]连通数( DFS )
- bzoj 2208: [Jsoi2010]连通数
- BZOJ2208 [JSOI2010] 连通数
- 【BZOJ2208】[Jsoi2010]连通数【BFS/DFS】【SCC】
- 【BZOJ 2208】 [Jsoi2010]连通数
- 【bzoj 2208】[Jsoi2010]连通数(dfs||Tarjan算法+拓扑序+dp)
- bzoj 2208: [Jsoi2010]连通数 (dfs|tarjan+bitset+拓扑序)
- 【bzoj2208】[Jsoi2010]连通数