记录编号 |
360851 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[HZOI 2014] 智哥的超时空传送 |
最终得分 |
100 |
用户昵称 |
Go灬Fire |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.017 s |
提交时间 |
2017-01-01 19:59:58 |
内存使用 |
0.43 MiB |
显示代码纯文本
- #include <cmath>
- #include <stack>
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- #define LL long long
- #define Inf 2e9
- #define pos(x,y) ((x-1)*m+y)
- #define Mem(arr,val) memset(arr,val,sizeof(arr))
- const int maxn=3010;
- const int maxnode=40*40+20;
- struct Edge{
- int from,next,to;
- }e[maxn],E[maxn];
- int Start,date[maxnode],n,m,len,head[maxnode],Low[maxnode],Dfn[maxnode],Time;
- int a[maxnode],num,Belong[maxnode],f[maxnode];
- bool flag[maxnode];
- stack<int> q;
- void Insert(int x,int y){
- len++;e[len].from=x;e[len].to=y;e[len].next=head[x];head[x]=len;
- }
- void Addedge(int x,int y){
- len++;E[len].to=y;E[len].next=head[x];head[x]=len;
- }
- void Dfs(int x){
- Dfn[x]=Low[x]=++Time;flag[x]=true;q.push(x);
- for(int i=head[x];i;i=e[i].next){
- int j=e[i].to;
- if(!Dfn[j]){
- Dfs(j);
- Low[x]=min(Low[x],Low[j]);
- }
- else if(flag[j])Low[x]=min(Low[x],Dfn[j]);
- }
- if(Low[x]==Dfn[x]){
- int k;num++;
- do{
- k=q.top();q.pop();
- flag[k]=false;Belong[k]=num;
- if(k==1)Start=num;
- if(a[k]>=0)date[num]+=a[k];
- }while(k!=x);
- }
- }
- int Dp(int x){
- if(f[x])return f[x];
- int Max=0;
- for(int i=head[x];i;i=E[i].next){
- int j=E[i].to;
- Max=max(Max,Dp(j));
- }
- return (f[x]=Max+date[x]);
- }
- void Init();
- int main(){
- freopen("tramcar.in","r",stdin);freopen("tramcar.out","w",stdout);
- int T=0;scanf("%d",&T);
- while(T--)Init();
- getchar();getchar();
- return 0;
- }
- void Init(){
- Mem(flag,0);Mem(a,0);Mem(date,0);Mem(Belong,0);num=0;Time=0;len=0;
- Mem(head,0);Mem(f,0);Mem(Dfn,0);Mem(Low,0);while(!q.empty())q.pop();
- Mem(e,0);Mem(E,0);
- scanf("%d%d",&n,&m);
- for(int i=1;i<=n;i++){
- for(int j=1;j<=m;j++){
- char ch;scanf(" %c",&ch);
- if(ch=='#')a[pos(i,j)]=-2;
- else if(ch=='*')a[pos(i,j)]=-1;
- else a[pos(i,j)]=ch-48;
- }
- }
- for(int i=1;i<=n;i++){
- for(int j=1;j<=m;j++){
- int k=pos(i,j);
- if(a[k]==-1){
- int x,y;scanf("%d%d",&x,&y);
- x++;y++;
- Insert(k,pos(x,y));
- }
- if(a[k]==-2)continue;
- if(a[k+1]!=-2 && j<m)Insert(k,k+1);
- if(a[k+m]!=-2 && i<n)Insert(k,k+m);
- }
- }
- for(int i=1;i<=n*m;i++)if(!Dfn[i])Dfs(i);
- int z=len;memset(head,0,sizeof(head));len=0;
- for(int i=1;i<=z;i++){
- int fr=e[i].from,to=e[i].to;
- if(Belong[fr]!=Belong[to])Addedge(Belong[fr],Belong[to]);
- }
- printf("%d\n",Dp(Start));
- }