题意:中文题。。
思路:要满足a -> b, b -> c且有a -> c的一条路,即图里面从任意点出发,没有长度大于1的路径长度,对每个点bfs一次,如果有长度大于1的路,就不是,直接返回
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
typedef long long ll;
const int maxn = 2017;
const int INF = 1e9;
const int mod = 1e8 + 7;
using namespace std;
vector<int> G[maxn];
vector<int> g[maxn];
char s[maxn][maxn];
char vis[maxn];
int n, T;
bool bfs(int u, vector<int> G[maxn]) {
memset(vis, 0, sizeof(vis));
vis[u] = 1;
queue<int> q; q.push(u);
while(!q.empty()) {
int v = q.front(); q.pop();
for(int i = 0; i < G[v].size(); i++) {
int nxt = G[v][i];
if(vis[nxt]) continue;
if(v != u) return false;
vis[nxt] = 1; q.push(nxt);
}
}
return true;
}
int main() {
scanf("%d", &T);
while(T--) {
int l1 = 1, l2 = 1;
scanf("%d", &n);
for(int i = 0; i < n; i++) scanf("%s", s[i]);
for(int i = 0; i < maxn; i++) {
g[i].clear();
G[i].clear();
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(s[i][j] == 'P') G[i].push_back(j);
if(s[i][j] == 'Q') g[i].push_back(j);
}
}
for(int i = 0; i < n; i++) {
if(!bfs(i, G)) { l1 = 0; break; }
if(!bfs(i, g)) { l2 = 0; break; }
}
if(l1 && l2) puts("T");
else puts("N");
}
return 0;
}