记录编号 360851 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [HZOI 2014] 智哥的超时空传送 最终得分 100
用户昵称 GravatarGo灬Fire 是否通过 通过
代码语言 C++ 运行时间 0.017 s
提交时间 2017-01-01 19:59:58 内存使用 0.43 MiB
显示代码纯文本
  1. #include <cmath>
  2. #include <stack>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8. #define LL long long
  9. #define Inf 2e9
  10. #define pos(x,y) ((x-1)*m+y)
  11. #define Mem(arr,val) memset(arr,val,sizeof(arr))
  12. const int maxn=3010;
  13. const int maxnode=40*40+20;
  14. struct Edge{
  15. int from,next,to;
  16. }e[maxn],E[maxn];
  17. int Start,date[maxnode],n,m,len,head[maxnode],Low[maxnode],Dfn[maxnode],Time;
  18. int a[maxnode],num,Belong[maxnode],f[maxnode];
  19. bool flag[maxnode];
  20. stack<int> q;
  21. void Insert(int x,int y){
  22. len++;e[len].from=x;e[len].to=y;e[len].next=head[x];head[x]=len;
  23. }
  24. void Addedge(int x,int y){
  25. len++;E[len].to=y;E[len].next=head[x];head[x]=len;
  26. }
  27. void Dfs(int x){
  28. Dfn[x]=Low[x]=++Time;flag[x]=true;q.push(x);
  29. for(int i=head[x];i;i=e[i].next){
  30. int j=e[i].to;
  31. if(!Dfn[j]){
  32. Dfs(j);
  33. Low[x]=min(Low[x],Low[j]);
  34. }
  35. else if(flag[j])Low[x]=min(Low[x],Dfn[j]);
  36. }
  37. if(Low[x]==Dfn[x]){
  38. int k;num++;
  39. do{
  40. k=q.top();q.pop();
  41. flag[k]=false;Belong[k]=num;
  42. if(k==1)Start=num;
  43. if(a[k]>=0)date[num]+=a[k];
  44. }while(k!=x);
  45. }
  46. }
  47. int Dp(int x){
  48. if(f[x])return f[x];
  49. int Max=0;
  50. for(int i=head[x];i;i=E[i].next){
  51. int j=E[i].to;
  52. Max=max(Max,Dp(j));
  53. }
  54. return (f[x]=Max+date[x]);
  55. }
  56. void Init();
  57. int main(){
  58. freopen("tramcar.in","r",stdin);freopen("tramcar.out","w",stdout);
  59. int T=0;scanf("%d",&T);
  60. while(T--)Init();
  61. getchar();getchar();
  62. return 0;
  63. }
  64. void Init(){
  65. Mem(flag,0);Mem(a,0);Mem(date,0);Mem(Belong,0);num=0;Time=0;len=0;
  66. Mem(head,0);Mem(f,0);Mem(Dfn,0);Mem(Low,0);while(!q.empty())q.pop();
  67. Mem(e,0);Mem(E,0);
  68. scanf("%d%d",&n,&m);
  69. for(int i=1;i<=n;i++){
  70. for(int j=1;j<=m;j++){
  71. char ch;scanf(" %c",&ch);
  72. if(ch=='#')a[pos(i,j)]=-2;
  73. else if(ch=='*')a[pos(i,j)]=-1;
  74. else a[pos(i,j)]=ch-48;
  75. }
  76. }
  77. for(int i=1;i<=n;i++){
  78. for(int j=1;j<=m;j++){
  79. int k=pos(i,j);
  80. if(a[k]==-1){
  81. int x,y;scanf("%d%d",&x,&y);
  82. x++;y++;
  83. Insert(k,pos(x,y));
  84. }
  85. if(a[k]==-2)continue;
  86. if(a[k+1]!=-2 && j<m)Insert(k,k+1);
  87. if(a[k+m]!=-2 && i<n)Insert(k,k+m);
  88. }
  89. }
  90. for(int i=1;i<=n*m;i++)if(!Dfn[i])Dfs(i);
  91. int z=len;memset(head,0,sizeof(head));len=0;
  92. for(int i=1;i<=z;i++){
  93. int fr=e[i].from,to=e[i].to;
  94. if(Belong[fr]!=Belong[to])Addedge(Belong[fr],Belong[to]);
  95. }
  96. printf("%d\n",Dp(Start));
  97. }