标签:abs next 处理 size logs queue turn sizeof its
又双叒叕死在最短路了,这题怎么看也像dfs啊,然鹅写挂了,
int u=get(i,j),v=get(i+a[j],j);//i表示层数,j表示手柄位置
if(j!=now && (i+a[j])>=1 && (i+a[j])<=n)add(u,v,abs(a[j])*2);
注意两层之间距离为a[j],而不是1,时间代价为abs(a[j]*2),
#include<bits/stdc++.h>
using namespace std;
const int maxn=30010;
const int maxm=1e6+10;
int head[maxn],Next[maxm<<1],ver[maxm<<1],edge[maxm<<1];
int a[maxn];
int tot,now;
int n,m;
void add(int x,int y,int z){
ver[++tot]=y;
edge[tot]=z;
Next[tot]=head[x];
head[x]=tot;
}
int get(int x,int y){
return (x-1)*m+y;
}
bool v[maxn];
int d[maxn];
priority_queue<pair<int,int > >q;
void dij(int s){
memset(d,0x3f,sizeof(d));
d[s]=0;
q.push(make_pair(0,s));
while(!q.empty()){
int x=q.top().second;
q.pop();
if(v[x])continue;
v[x]=1;
for(int i=head[x];i;i=Next[i]){
int y=ver[i],z=edge[i];
if(d[y]>d[x]+z){
d[y]=d[x]+z;
q.push(make_pair(-d[y],y));
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d",&a[i]);
if(a[i]==0)now=i;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(j<m)add(get(i,j),get(i,j+1),1);
if(j>1)add(get(i,j),get(i,j-1),1);
int u=get(i,j),v=get(i+a[j],j);
if(j!=now && (i+a[j])>=1 && (i+a[j])<=n)add(u,v,abs(a[j])*2);
}
}
for(int i=1;i<=m;i++){
add(get(n,i),n*m+1,0);
}
dij(get(1,now));
int ans=0x7f7f7f7f;
if(d[n*m+1]>=1061109567)printf("-1\n");
else printf("%d\n",d[n*m+1]);
return 0;
}
标签:abs next 处理 size logs queue turn sizeof its
原文地址:https://www.cnblogs.com/soda-ma/p/13251197.html