【傳遞閉包+bitset優化】BZOJ2208 [Jsoi2010]連通數
阿新 • • 發佈:2019-01-05
首先
一眼就看到了是傳遞閉包問題
定義
問題在於怎麼轉移這個遞推
可以用Tarjan縮點後按拓撲序遞推,最壞是
當然了……對於我這種懶人,最適合的還是Floyd大法
然後就變成了
示例程式:
#include<cstdio>
#include<bitset>
using namespace std;
const int maxn=2005;
int n,ans;
char s[maxn];
bitset<maxn> f[maxn];
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%s",s);
for (int j=1;j<=n;j++)
if (s[j-1]=='1'||i==j) f[i][j]=1;
}
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (f[j].test(i)) f[j]|=f[i];
for (int i=1;i<=n;i++) ans+=f[i].count();
printf ("%d",ans);
return 0;
}