思路其實很簡單就是跑兩次floyd
但是問題是這樣會超時,所以用bitset優化
bitset每位只佔乙個bit
而bool佔乙個byte
1byte=4bit
遍歷bitset的複雜度為\(o(/)\)
w在根據計算機不同為32/64
具體的操作可以參考部落格鏈結
這樣複雜度優化到\(o(n^3/w)\)
#include#define fi first
#define se second
#define debug cout<<"i am here"const int maxn=1e3+5,inf=0x3f3f3f3f;
const int eps=1e-3;
const ll mod=1004535809;
bitseta[maxn],b[maxn];
int n,m1,m2,q;
signed main()
for(int i=1,u,v;i<=m2;i++)
for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
for(int mid=1;mid<=n;mid++)
if(b[beg][mid])}}
for(int i=1,u,v;i<=q;i++)else
if(b[u][v])else
}return 0;
}
bitset 優化 01 矩乘
這裡的矩乘並不狹隘地專指一般矩陣乘法,而可以指所有與一般矩乘一樣具有結合律的二元矩陣運算。例 定義一種 01 矩陣乘法 a cdot b c 為下面的 c for int i 1 i n i for int j 1 j n j for int k 1 k n k c i j a i k b k j ...
Sajam(01翻轉 bitset優化)
原題 題意 n n的01矩陣,你可以無限次翻轉一行或者一列,可以最多翻轉k k n 次乙個點。問是否可以全部翻轉成0。解析 k n說明至少有一行不會被翻轉單個點,或者k n時每行翻轉乙個點。那麼列舉每一行為那一行,將其他行與之對比 可以翻轉後再對比 不同的數量就是需要翻轉單個點的數量。因為有列翻轉,...
bzoj3687 簡單題 bitset優化揹包
給定乙個總和不大於2e6的數集,求子集的算術和的異或和。好像可以直接上01揹包dp。但是會tle。其實記錄的只是每個體積的狀態的奇偶,所以方程可以寫成dp i dp i dp i x dp i d p i dp i x 然後發現每乙個點都是異或上前面一定距離的數,所以我們可以把整個陣列往後移動x個然...