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

 

posted @ 2017-11-09 09:39  I__am  阅读(169)  评论(0编辑  收藏  举报