上学要迟到了
前言
没想到此题甚水
分析
这道题的思路很好想,因为一个车站只对应三种选择——步行去下一个站,步行去上一个站,坐车去这辆车的下
一个停靠点,建边跑最短路就完了
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,s,t,T,tot;
int a[N],pri[N],col[N],val[N<<2];
int h[N],nex[N<<2],ver[N<<2],dis[N];
bool vis[N];
inline void add(int x,int y,int z)
{
nex[tot]=h[x];
ver[tot]=y;
val[tot]=z;
h[x]=tot++;
}
inline void dfs(int kl)
{
queue<int>q;
vis[kl]=1;dis[kl]=0;
q.push(kl);
while(!q.empty())
{
int k=q.front();q.pop();
for (int i=h[k];~i;i=nex[i])
{
int j=ver[i];
if(dis[j]>dis[k]+val[i])
{
dis[j]=dis[k]+val[i];
if(!vis[j])
vis[j]=1,q.push(j);
}
}vis[k]=0;
}
}
int main()
{
memset(h,-1,sizeof(h));
memset(dis,0x3f,sizeof(dis));
scanf("%d%d%d%d%d",&n,&m,&s,&t,&T);
for (int i=1;i<=m;i++) scanf("%d",&pri[i]);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<=n;i++)
{
if(i!=1) add(i,i-1,T);
if(i!=n) add(i,i+1,T);
if(col[a[i]]) add(col[a[i]],i,pri[a[i]]);
col[a[i]]=i;
}
dfs(s);
printf("%d\n",dis[t]);
return 0;
}