BZOJ-2208-[Jsoi2010]连通数(bitset+floyd)

Posted I__am

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ-2208-[Jsoi2010]连通数(bitset+floyd)相关的知识,希望对你有一定的参考价值。

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。

 

Source

 

题解

这道题刚看到就想到暴力,时限有20s,dfs可以A

但是dfs有些慢,我们想一些更优的算法

这道题就是让我们求传递闭包

所以我们可以用bitset来优化floyd

技术分享
 1 #include<bits/stdc++.h>
 2 #define N 2005
 3 using namespace std;
 4 int n,x,ans;
 5 bitset<N>flag[N];
 6 char st[N];
 7 int main(){
 8     scanf("%d",&n);
 9     for (int i=1;i<=n;i++){
10         scanf("%s",st+1);
11         for (int j=1;j<=n;j++)
12             if (st[j]==1||i==j) flag[i][j]=true;
13     }
14     for (int j=1;j<=n;j++)
15         for (int i=1;i<=n;i++)
16             if (flag[i][j]) flag[i]|=flag[j];
17     for (int i=1;i<=n;i++)
18         ans+=flag[i].count();
19     printf("%d\n",ans);
20     return 0;
21 } 
View Code

 




以上是关于BZOJ-2208-[Jsoi2010]连通数(bitset+floyd)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj2208[Jsoi2010]连通数

bzoj 2208: [Jsoi2010]连通数

bzoj2208 [Jsoi2010]连通数

bzoj2208: [Jsoi2010]连通数(dfs)

BZOJ2208: [Jsoi2010]连通数

[bzoj2208][Jsoi2010]连通数