两份代码:
#include<bits/stdc++.h>
#define ll long long
#define il inline
#define re register
using namespace std;
ll n,m,sum,l,head[100005],d_to1[100005],id[100005],point[100005],d_ton[100005],to[100005];
bool vis[100005],minv[100005],minev[100005];
struct px
{
ll id,dis;
bool operator <(const px&b)const
{
return dis>b.dis;
}
};
priority_queue<px>a;
il void insert(ll id,ll dis)
{
px t;
t.dis=dis;t.id=id;
a.push(t);
}
queue<ll>k;
struct ed
{
ll u,v,w,next;
}edge[200005];
il void add(ll u,ll v,ll w)
{
edge[++sum].v=v;
edge[sum].w=w;
edge[sum].u=u;
edge[sum].next=head[u];
head[u]=sum;
}
il void sp(ll s)
{
memset(vis,0,sizeof(vis));
vis[s]=1;
k.push(s);
while(!k.empty())
{
ll u=k.front();k.pop();vis[u]=0;
for(re ll i=head[u];i;i=edge[i].next)
{
ll v=edge[i].v,w=edge[i].w;
if(!minev[i]&&d_to1[u]+w<d_to1[v])
{
d_to1[v]=d_to1[u]+w;
if(minv[v])
insert(to[v],d_to1[v]+d_ton[to[v]]);
else if(!vis[v])
{
vis[v]=1;
k.push(v);
}
}
}
}
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m>>l;
ll u,v,w;
memset(d_to1,127,sizeof(d_to1));d_to1[1]=0;
for(re ll i=1;i<=m;++i)
cin>>u>>v>>w,add(u,v,w);
for(re ll i=1;i<=l;++i)
cin>>id[i],point[i+1]=edge[id[i]].v,minv[point[i+1]]=1,minev[id[i]]=1,to[point[i+1]]=i+1;
point[1]=1;
for(re ll i=l;i>0;--i)
d_ton[i]=d_ton[i+1]+edge[id[i]].w;
sp(1);
for(re ll i=1;i<=l;++i)
{
while(!a.empty()&&a.top().id<=i) a.pop();
cout<<((!a.empty())?a.top().dis:-1)<<'\n';
d_to1[edge[id[i]].v]=d_to1[edge[id[i]].u]+edge[id[i]].w;
sp(edge[id[i]].v);
}
}
#include<bits/stdc++.h>
#define ll long long
#define il inline
#define re register
using namespace std;
ll n,m,sum,l,head[100005],d_to1[100005],id[100005],point[100005],d_ton[100005],to[100005];
bool vis[100005],minv[100005],minev[100005];
struct px
{
ll id,dis;
bool operator <(const px&b)const
{
return dis>b.dis;
}
};
priority_queue<px>a;
il void insert(ll id,ll dis)
{
px t;
t.dis=dis;t.id=id;
a.push(t);
}
queue<ll>k;
struct ed
{
ll u,v,w,next;
}edge[200005];
il void add(ll u,ll v,ll w)
{
edge[++sum].v=v;
edge[sum].w=w;
edge[sum].u=u;
edge[sum].next=head[u];
head[u]=sum;
}
il void sp(ll s)
{
memset(vis,0,sizeof(vis));
vis[s]=1;
k.push(s);
while(!k.empty())
{
ll u=k.front();k.pop();vis[u]=0;
for(re ll i=head[u];i;i=edge[i].next)
{
ll v=edge[i].v,w=edge[i].w;
if(!minev[i]&&d_to1[u]+w<d_to1[v])
{
d_to1[v]=d_to1[u]+w;
if(minv[v])
insert(to[v],d_to1[v]+d_ton[to[v]]);
else if(!vis[v])
{
vis[v]=1;
k.push(v);
}
}
}
}
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m>>l;
ll u,v,w;
memset(d_to1,127,sizeof(d_to1));d_to1[1]=0;
for(re ll i=1;i<=m;++i)
cin>>u>>v>>w,add(u,v,w);
for(re ll i=1;i<=l;++i)
cin>>id[i],point[i+1]=edge[id[i]].v,minev[id[i]]=1,to[point[i+1]]=i+1,minv[point[i+1]]=1;//改变的位置
point[1]=1;
for(re ll i=l;i>0;--i)
d_ton[i]=d_ton[i+1]+edge[id[i]].w;
sp(1);
for(re ll i=1;i<=l;++i)
{
while(!a.empty()&&a.top().id<=i) a.pop();
cout<<((!a.empty())?a.top().dis:-1)<<'\n';
d_to1[edge[id[i]].v]=d_to1[edge[id[i]].u]+edge[id[i]].w;
sp(edge[id[i]].v);
}
}
RT,本蒟蒻在改变数组 minv 的赋值在逗号中的顺序后(并没有改变赋值中调用的数组 point 与该数组的相对赋值顺序)就过了,怀疑是逗号导致的问题,求大佬讲解。