分析
spfa
代码
#include <cstdio>
#include <cctype>
using namespace std;
struct node{int x,y,w,next,l,r;}e[20001];
int n,m,ls[1001],time[1001]; bool v[1001];
void spfa(int st){
int list[1001],head=0,tail=1; list[1]=st; v[st]=1;
do{
head=head%n+1;
int t=ls[list[head]];
while (t){
if (time[e[t].y]>time[e[t].x]+e[t].w){
if (time[e[t].x]<e[t].l||time[e[t].x]>=e[t].r)//可以走
time[e[t].y]=time[e[t].x]+e[t].w;
else if (time[e[t].y]>time[e[t].x]+e[t].w+e[t].r-time[e[t].x])//等待
time[e[t].y]=time[e[t].x]+e[t].w+e[t].r-time[e[t].x];
if (!v[e[t].y]){
v[e[t].y]=1;
tail=tail%n+1;
list[tail]=e[t].y;
}
}
t=e[t].next;
}
v[list[head]]=0;
}while (head!=tail);
}
int in(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
void add(int x,int y,int w){
e[++m].x=x; e[m].y=y; e[m].w=w; e[m].next=ls[e[m].x]; ls[e[m].x]=m;
}
int main(){
int st,en,stt,g,o,c[1001];
n=in(); o=in(); st=in(); en=in(); stt=in(); stt++; g=in();
for (int i=1;i<=g;i++) c[i]=in();
while (o--){
int x=in(),y=in(),w=in();
add(x,y,w); add(y,x,w);
}
int s=1;
for (int i=1;i<g;i++){//入边处理重要人物走的时间
int t=ls[c[i]];
while (t){
if (e[t].y==c[i+1]) e[t].l=s,e[t].r=s+e[t].w,s+=e[t].w;
t=e[t].next;
}
}
for (int i=g;i>1;i--){//出边处理
int t=ls[c[i]];
while (t){
if (e[t].y==c[i-1]) e[t].l=s-e[t].w,e[t].r=s,s-=e[t].w;
t=e[t].next;
}
}
for (int i=1;i<=n;i++) time[i]=2147483647; time[st]=stt;
spfa(st);
printf("%d",time[en]-stt);
return 0;
}