[BZOJ2208][P4306][JSOI2010]连通数[bitset优化floyd]

#include <bits/stdc++.h>
using namespace std;
int n, ans, c, i, j, k;
bitset<2007>a[2005];
int read() {
    for(c = getchar(); !isdigit(c); c = getchar());
    return c-'0';
}
int main() {
    scanf("%d", &n);
    for (i = 1; i <= n; a[i][i] = 1, ++i)
        for (j = 1; j <= n; ++j) a[i][j] = read();
    for(k = 1; k <= n; ++k)
      for(i = 1; i <= n; ++i)
        if (a[i][k]) a[i] |= a[k];
    for(i = 1; i <= n; ++i) ans += a[i].count();
    cout << ans;
    return 0;
}

注意枚举顺序
正常的floyd是 k i j枚举 k是中间点

优化的时候就不用枚举j(终点)了

posted @ 2018-12-28 16:43  QvvQ  阅读(151)  评论(0编辑  收藏  举报