题解:P10948 升降梯上
这不就是板子。
根本不用显性建边,把当前的层数和手柄所在的位置存下来,之后枚举
时间复杂度:
哦当然,这指的是 dijkstra 算法的理论复杂度(当然它很稳定),其中的
每个点都有
#include<bits/stdc++.h>
using namespace std;
int d[500005],n,m,s,head[500005],cnt,vis[500005],c[500005];
struct node{
int to,next,w;
}a[500005];
struct edge{
int w,to,pos;
bool operator <(const edge &x)const
{
return x.w<w;
}
};
priority_queue<edge>q;
void dijkstra()
{
memset(d,0x3f,sizeof d);
d[1]=0;
memset(vis,0,sizeof vis);
while(!q.empty())
{
int x=q.top().to;
int z=q.top().pos;
q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=1;i<=m;i++)
{
int v=x+c[i];
if(v<1||v>n) continue;
int w=2*abs(c[i])+abs(z-i);
if(d[v]>d[x]+w)
{
d[v]=d[x]+w;
if(!vis[v]) q.push({d[v],v,i});
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>c[i];
if(!c[i]) q.push({0,1,i});
}
dijkstra();
cout<<(d[n]>=0x3f3f3f3f?-1:d[n]);
return 0;
}