RT,70pt,【2,7,10】三个数据点WA
#include<bits/stdc++.h>
#define int long long
#define N 600010
using namespace std;
int cnt=1,head[N],to[N],nxt[N],val[N];
int pn;
int n,m,Q;
void insert(int u,int v,int w) {
cnt++;
to[cnt]=v;
val[cnt]=w;
nxt[cnt]=head[u];
head[u]=cnt;
}
priority_queue<pair<int,int> > q;
int disS[N],disT[N],INF=0x3f3f3f3f3f3f3f3f,lst[N],l[N],r[N];
int path[N],ind[N];
inline void Dij(int s,int dis[],int f=0) {
for(int i=1; i<=n; i++) dis[i]=INF;
q.push(make_pair(dis[s]=0,s));
while(!q.empty()) {
int now=q.top().second;q.pop();
// cout<<now<<" ";
for(int i=head[now]; i; i=nxt[i])
if(dis[to[i]]>dis[now]+val[i]&&((f%2==1&&i%2==0)||(f%2==0&&i%2==1))) {
dis[to[i]]=dis[now]+val[i];
lst[to[i]]=i;
if(f==1&&!path[to[i]]) l[to[i]]=l[now];
if(f==2&&!path[to[i]]) r[to[i]]=r[now];
q.push(make_pair(-dis[to[i]],to[i]));
}
}
// cout<<dis[1]<<endl;
}
int pid[N];
int tr[4*N];
void build(int k,int l,int r) {
tr[k]=INF;
if(l==r) return ;
int mid=(l+r)/2;
build(2*k,l,mid);
build(2*k+1,mid+1,r);
}
void updata(int k,int l,int r,int L,int R,int num) {
if(L>R) return ;
if(L<=l&&r<=R) {
tr[k]=min(tr[k],num);
return ;
}
int mid=(l+r)/2;
if(L<=mid) updata(2*k,l,mid,L,R,num);
if(R>mid) updata(2*k+1,mid+1,r,L,R,num);
}
int query(int k,int l,int r,int pos) {
if(l==r) return tr[k];
int res=tr[k];
int mid=(l+r)/2;
if(pos<=mid) res=min(res,query(2*k,l,mid,pos));
else res=min(res,query(2*k+1,mid+1,r,pos));
return res;
}
signed main()
{
memset(tr,0x3f,sizeof(tr));
cin>>n>>m>>Q;
for(int i=1; i<=m; i++) {
int u,v,w;
cin>>u>>v>>w;
insert(u,v,w);
insert(v,u,w);
}
Dij(n,disT);
for(int i=1; i<=Q; i++) cin>>pid[i];
path[1]=1;
l[1]=r[1]=0;
int cur=1;
for(int i=1; i<=Q; i++) {
int id=pid[i];
ind[id]=i;
pn++;
cur=to[id*2]^to[id*2+1]^cur;
path[cur]=1;
l[cur]=r[cur]=i;
}
Dij(1,disS,1);
Dij(n,disT,2);
build(1,1,pn);
for(int i=1; i<=m; i++) if(!ind[i]) {
int u=to[2*i],v=to[2*i+1],w=val[2*i];
// updata(1,1,pn,l[u]+1,r[v],disS[u]+w+disT[v]);
updata(1,1,pn,l[v]+1,r[u],disS[v]+w+disT[u]);
// cout<<l[u]+1<<" "<<r[v]<<" "<<disS[u]+w+disT[v]<<endl;
// cout<<l[v]+1<<" "<<r[u]<<" "<<disS[v]+w+disT[u]<<endl;
}
for(int i=1; i<=Q; i++) {
int id,x,ans=disS[n];
id=pid[i];
int u=to[id*2],v=to[id*2+1],w=val[id*2];
// if(ind[id]) {
// cout<<"in\n";
// cout<<u<<" "<<v<<endl;
ans=min(INF,query(1,1,pn,ind[id]));
// }
cout<<ans<<endl;
}
return 0;
}