一道关于竞赛图的题目

来源:互联网 发布:一人能开几个淘宝店 编辑:程序博客网 时间:2024/06/01 08:38


呃。没啥说的。。上面都有


#include<cmath>#include<ctime>#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<bitset>#include<queue>#include<set>#include<map>using namespace std;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}void print(int x){if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}const int N=2050;int last[N],ecnt;struct EDGE{int to,nt;}e[N*N];inline void add(int u,int v){e[++ecnt]=(EDGE){v,last[u]};last[u]=ecnt;}int book[N];bool flag;void dfs(int u){if(flag)return ;book[u]=2;for(int i=last[u];i;i=e[i].nt){if(!book[e[i].to])dfs(e[i].to);else if(book[e[i].to]==2){flag=1;return ;}}book[u]=1;}char s[N];int U[N*N],V[N*N];int main(){int T=read();register int i,j,cnt;while(T--){int n=read();cnt=0;for(i=1;i<=n;++i){scanf("%s",s+1);for(j=1;j<=n;++j)if(s[j]=='P')U[++cnt]=i,V[cnt]=j,add(i,j);else if(s[j]=='Q')U[++cnt]=i,V[cnt]=j,add(j,i);}flag=0;for(i=1;i<=n;++i)if(!book[i])dfs(i);if(!flag){memset(last,0,sizeof(last));ecnt=0;memset(book,0,sizeof(book));for(i=1;i<=cnt;++i)add(U[i],V[i]);for(i=1;i<=n;++i)if(!book[i])dfs(i);}flag?puts("N"):puts("T");if(T){memset(last,0,sizeof(last));ecnt=0;memset(book,0,sizeof(book));}}}/*14----Q-Q-P--PPP--N*/

原创粉丝点击