0
点赞
收藏
分享

微信扫一扫

传递 HDU - 5961

zhoulujun 2022-06-15 阅读 45

​​http://acm.hdu.edu.cn/showproblem.php?pid=5961​​

最暴力的考虑 将两个关系矩阵相乘得出的新矩阵中 mat[i][j]的值代表 i两步走到j有几种方式 即i与j之间存在几个中间点

但是n^3肯定不行 考虑优化 发现关系矩阵就是01矩阵 正好可以用bitset优化一下行列相乘

 

无意中发现了别人更巧妙的方法 直接n遍bfs 每次看是否存在一个点的距离大于等于2就好了。。

 

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e3+50;

bitset <maxn> bit1[maxn],bit2[maxn];
int n;
char e[maxn][maxn];

bool judge(char tp)
{
bitset <maxn> pre;
int i,j;
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(e[i][j]==tp) bit1[i][j]=1,bit2[j][i]=1;
else bit1[i][j]=0,bit2[j][i]=0;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
pre=bit1[i]&bit2[j];
if(pre.any()&&e[i][j]!=tp) return 0;
}
}
return 1;
}

int main()
{
int t,i,j,res1,res2;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%s",e[i]);
res1=judge('P'),res2=judge('Q');
if(res1&&res2) printf("T\n");
else printf("N\n");
}
return 0;
}

 


举报

相关推荐

0 条评论