关于 Floyed,它活了
  • 板块学术版
  • 楼主STUDENT00
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/4/21 17:17
  • 上次更新2024/4/21 20:22:31
查看原帖
关于 Floyed,它活了
658786
STUDENT00楼主2024/4/21 17:17

这是B3611 【模板】传递闭包的代码:

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n;
bitset<N> f[N];
inline int read(){
	char ch=getchar();
	while((ch^48)&(ch^49)) ch=getchar();
	return (ch^48);
}
inline void put(int x){
	putchar((x%10)^48);
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) f[i][j]=read();
	for(int k=1;k<=n;k++){
		for(int i=1;i<=n;i++){
			if(f[i][k]) f[i]|=f[k];
		}
	}
	for(int i=1;i<=n;i++,putchar(10)) for(int j=1;j<=n;j++) put(f[i][j]),putchar(32);
	return 0;
}

显然,我们可以把外边的 k,i 两重循环优化至 O(m)O(m) 级(邻接表,只需处理 f[i][k]=1 的)。

附上 O(nw)O(\frac{n}{w}) 的 bitset 或运算,总时复 O(nmw)O(\frac{nm}{w})?!

2024/4/21 17:17
加载中...