HDU5961传递

分析

啥是竞赛图啊
竞赛图对这个题好像没有很大的影响,考虑什么样的能够传递,其实说白了就是对于一个顶点\(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");
	}
}
posted @ 2020-05-21 06:51  An_Fly  阅读(112)  评论(0编辑  收藏  举报