/*
hdu5691 图的传递性~~~~假如a是b的父亲节点,b是c的父亲节点,那么a就一定要是c的父亲节点,则是传递。
假如 a 连接b,c,d, 则b连接c 他们是传递,假如b连接 e 则就不是传递了,这个传递的性质搞清楚就好了,
唉~~~对着图看半天看不懂。后来还是搜题解看懂的。
阿洗吧~~~看完题解 这就很水了 。好尴尬~~~~~~~~~~~
用bfs 判断层次,如果 层次大于1 则不传递了。想想 也是的~
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<vector>
#include<queue>
using namespace std;
#define MAX 2020
#define INF 999999999
vector<int>p[MAX];
vector<int>q[MAX];
struct node
{
int x,step;
};
int n;
char a[2030];
int vis[2030];
int jude()//判
{
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
queue<node>q;
node a={i,0};
q.push(a);
while(!q.empty())
{
a=q.front();
q.pop();
if(a.step>=2) return 0;
for(int i=0;i<p[a.x].size();i++)
{
int v=p[a.x][i];
if(!vis[v])
{
vis[v]=1;
node b={v,a.step+1};
q.push(b);
}
}
}
}
return 1;
}
int jude2()
{
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));
queue<node>q1;
node a={i,0};
q1.push(a);
while(!q1.empty())
{
a=q1.front();
q1.pop();
if(a.step>=2) return 0;
for(int i=0;i<q[a.x].size();i++)
{
int v=q[a.x][i];
if(!vis[v])
{
vis[v]=1;
node b={v,a.step+1};
q1.push(b);
}
}
}
}
return 1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
p[i].clear();
q[i].clear();
}
for(int i=1;i<=n;i++)
{
scanf("%s",a+1);
for(int j=1;j<=n;j++)
{
if(a[j]=='P')
{
p[i].push_back(j);
}
if(a[j]=='Q')
{
q[i].push_back(j);
}
}
}
if(jude()&&jude2()) printf("T\n");
else printf("N\n");
}
}
hdu5961
最新推荐文章于 2022-09-22 22:32:22 发布