BZOJ-2208-[Jsoi2010]连通数(bitset+floyd)
Description
Input
输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。
Output
输出一行一个整数,表示该图的连通数。
Sample Input
3
010
001
100
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 }