其他分享
首页 > 其他分享> > 【洛谷P4306】连通数【bitset 传递闭包】

【洛谷P4306】连通数【bitset 传递闭包】

作者:互联网

在这里插入图片描述
在这里插入图片描述
l i n k link link

分析:

用 b i t s e t bitset bitset神器 + + + 传递闭包就行了
传递闭包可以求出所有点的所能到达的点集

如果直接 n 3 n^3 n3传递闭包会 T T T 用 b i t s e t bitset bitset可以优化成 n 2 n^2 n2
具体 b i t s e t bitset bitset用法 : : :
t e s t ( i ) test(i) test(i)表示查找 i i i下标的元素为 1 1 1或 0 0 0 c o u n t ( ) count() count()表示 1 1 1的个数

CODE:

#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<bitset>
using namespace std;
typedef long long ll;
const int N=2005;
int n,ans;
char s[N];
bitset<N> a[N];
int main()
{
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%s",s);
		for(int j=0;j<n;j++)
			a[i][j]=s[j]-'0';
		a[i][i]=1;
	}
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			if(a[j].test(i))  //相当于a[j][i]==1
				a[j]|=a[i];
	for(int i=0;i<n;i++)
		ans+=a[i].count();
	printf("%d",ans);
	
	return 0;
}

标签:闭包,洛谷,int,long,传递,连通数,bitset,include
来源: https://blog.csdn.net/dgssl_xhy/article/details/118685142