上学要迟到了
题目
牛牛早上起床一看,自己睡过了,赶紧起床准备去学校,他去学校只有两种方式,坐公交车和步行,牛牛去学校是一条直线,这条直线上总共有 nnn 个车站,车站之间的距离都是相等的,每个车站只有一种公交车aia_iai,每个公交车只在对应的公交站停车,每个公交车的速度也不一样,第 iii 种公交车过一站的时间需要 tit_iti,并且公交车是单向行驶,只能从左到到右,走路可以任意走,然而牛牛自己步行走一站需要的时间为 TTT,恰好牛牛家和学校都在某一个站点,分别为 sss 和 ttt,问最少需要多少时间牛牛才能到学校?
分析
直接建图跑最短路,注意公交车是单向的,而人可以双向行走
代码
#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0)
#pragma GCC optimize(2)
#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<string>
#include<vector>
#include<cstdio>
#include<random>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<unordered_map>
#include<unordered_set>
using namespace std;
mt19937 rnd(233);
typedef long long ll;
typedef pair<int,int> pii;
const int mod=1e9+7;
const int N=100010;
int h[N],e[N],ne[N],w[N],idx;
int n,m,s,t,T;
int cost[N];
int last[N];
bool st[N];
int dist[N];
void add(int a,int b,int c)
{e[idx]=b;ne[idx]=h[a];w[idx]=c;h[a]=idx++;
}
int dijkstra(int start,int ed)
{memset(dist,0x3f,sizeof dist);dist[start]=0;priority_queue<pii,vector<pii>,greater<pii> >q;q.push({0,start});while(q.size()){int t=q.top().second;q.pop();if(st[t]) continue;st[t]=1;for(int i=h[t];i!=-1;i=ne[i]){int j=e[i];if(dist[j]>dist[t]+w[i]) {dist[j]=dist[t]+w[i];q.push({dist[j],j});}}if(t+1<=n) {if(dist[t+1]>dist[t]+T){dist[t+1]=dist[t]+T;q.push({dist[t+1],t+1});}}if(t-1>0){if(dist[t-1]>dist[t]+T){dist[t-1]=dist[t]+T;q.push({dist[t-1],t-1});}}}return dist[ed];
}int main()
{IO;memset(h,-1,sizeof h);cin>>n>>m>>s>>t>>T;for(int i=1;i<=m;i++) cin>>cost[i];for(int i=1;i<=n;i++){int a;cin>>a;if(last[a]) add(last[a],i,cost[a]);last[a]=i;}cout<<dijkstra(s,t)<<'\n';return 0;
}