1. 程式人生 > >【傳遞閉包+bitset優化】BZOJ2208 [Jsoi2010]連通數

【傳遞閉包+bitset優化】BZOJ2208 [Jsoi2010]連通數

題面在這裡

首先O(nm)的暴力貌似能過?

一眼就看到了是傳遞閉包問題
定義 f[i][j]表示 i是否能到 j

問題在於怎麼轉移這個遞推
可以用Tarjan縮點後按拓撲序遞推,最壞是O(n232)
當然了……對於我這種懶人,最適合的還是Floyd大法
然後就變成了 O(n332)……

示例程式:

#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; }