题意:判断两个图是否都满足传递性。
题解:对于一个图来说如果a[i][j]==1那么a[i]|a[j]==a[i]。有一条i到j的边,同时j有一条到k的边,如果a[i][k]==1,那么就说明有一条i到k的边,即满足传递性。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <vector>
#include <bitset>
using namespace std;
bitset<2050> a[2050];
char s[2205][2205];int n;
bool solve(char c)
{
for(int i=1;i<=n;i++) a[i].reset();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(s[i][j]==c) a[i].set(j);
}
}
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
if(a[i][j]&&(a[i]|a[j])!=a[i]) return 0;
return 1;
}
int main()
{
int t;scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
if(solve('P')&&solve('Q'))
{
printf("T\n");
}
else
printf("N\n");
}
return 0;
}