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
");
		else printf("N
");
	}
}
原文地址:https://www.cnblogs.com/anyixing-fly/p/12927917.html