HDU 5961 传递
题目链接:HDU-5961
用vector存直接暴力dfs也可AC。正解如下(看了icpc-camp的题解,感觉写的很好,直接引用了。原链接:2016 合肥解题报告):
代码(暴力)如下:
1 #include"cstdio" 2 #include"iostream" 3 #include"cstring" 4 #include"algorithm" 5 #include"cstdlib" 6 #include"vector" 7 using namespace std; 8 typedef long long LL; 9 const int MAXN=3000; 10 11 char s[MAXN][MAXN]; 12 vector<int> nextP[MAXN],nextQ[MAXN]; 13 int main() 14 { 15 #ifdef LOCAL 16 freopen("in.txt","r",stdin); 17 //freopen("out.txt","w",stdout); 18 #endif 19 int t; 20 scanf("%d",&t); 21 for(int tt=1;tt<=t;tt++) 22 { 23 int n; 24 scanf("%d",&n); 25 for(int i=1;i<=n;i++) 26 { 27 nextP[i].clear(); 28 nextQ[i].clear(); 29 } 30 for(int i=1;i<=n;i++) 31 { 32 if(getchar()=='\r') getchar(); 33 for(int j=1;j<=n;j++) 34 { 35 s[i][j]=getchar(); 36 if(s[i][j]=='P') 37 nextP[i].push_back(j); 38 else if(s[i][j]=='Q') 39 nextQ[i].push_back(j); 40 } 41 } 42 bool ok=true; 43 for(int i=1;i<=n;i++) 44 { 45 for(unsigned int j=0;ok && j<nextP[i].size();j++) 46 { 47 int u=nextP[i][j]; 48 for(unsigned int k=0;ok && k<nextP[u].size();k++) 49 { 50 int v=nextP[u][k]; 51 if(s[i][v]!='P') 52 ok=false; 53 } 54 } 55 } 56 for(int i=1;i<=n;i++) 57 { 58 for(unsigned int j=0;ok && j<nextQ[i].size();j++) 59 { 60 int u=nextQ[i][j]; 61 for(unsigned int k=0;ok && k<nextQ[u].size();k++) 62 { 63 int v=nextQ[u][k]; 64 if(s[i][v]!='Q') 65 ok=false; 66 } 67 } 68 } 69 if(ok) printf("T\n"); 70 else printf("N\n"); 71 } 72 return 0; 73 }