1. 程式人生 > >BZOJ-2208-[Jsoi2010]連通數(bitset+floyd)

BZOJ-2208-[Jsoi2010]連通數(bitset+floyd)

pac n) int border color view += set 技術

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)