分析
啥是竞赛图啊
竞赛图对这个题好像没有很大的影响,考虑什么样的能够传递,其实说白了就是对于一个顶点\(u\),如果他的一条出边的顶点\(v\)能够到达\(x\),那么\(u\)也能到达\(x\),然后因为只涉及到能不能到达,所以用bitset完美解决。
时间复杂度应该\(O(Tn^2)\),最多有八组极限数据,2016的平方是32514048,一秒的话肯定不够,六秒就可以了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>
using namespace std;
const int N=2020;
struct Edge{
int to,nxt;
}e[N*N];
bitset<N> dis[N];
int idx,h[N],n;
void Ins(int a,int b){
dis[a][b]=1;
e[++idx].to=b;
e[idx].nxt=h[a];
h[a]=idx;
}
char s[N][N];
bool judge(char ch){
memset(h,0,sizeof(h));
idx=0;
for(int i=0;i<n;i++){
dis[i].reset();
for(int j=0;j<n;j++)
if(s[i][j]==ch)
Ins(i,j);
}
for(int i=0;i<n;i++)
for(int j=h[i];j;j=e[j].nxt){
int v=e[j].to;
if((dis[v]&dis[i])!=dis[v])return 0;
}
return 1;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",s[i]);
if(judge('P')&&judge('Q'))
printf("T\n");
else printf("N\n");
}
}