Análisis:
¡Pregunta de rutina!
Utilice dij para preprocesar la ruta más corta desde 1 al resto de los puntos (registrada con d1 []), luego procese la ruta más corta desde n hasta los puntos restantes (registrada con d2 []).
Deje que la ruta más corta inicial sea dn
Si (x, y) es la ruta, la inversión de ruta hace que la ruta más corta sea más corta. Explique que la nueva ruta más corta debe pasar por este lado
Así que acaba de calcular d1 [y] + d2 [x ] + w (x, y) <dn satisfacer la salida SÍ, si
no hay salida de NO
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
const int N=2e5+100000;
typedef pair<ll,ll> PII;
vector<PII> g1[N],g2[N];
ll d1[N],d2[N],w;
int n,m,u,v;
struct node
{
ll u,v,w;
}e[N];
void dij(vector<PII> g[],ll d[],int s)
{
for(int i=1;i<=n;i++) d[i]=1e18;
d[s]=0;
priority_queue<PII,vector<PII>,greater<PII> > q;
q.push({0,s});
while(q.size())
{
auto p=q.top();
q.pop();
int ver=p.y;
for(auto i:g[ver])
{
int j=i.x;
ll w=i.y;
if(d[j]>w+d[ver])
{
d[j]=w+d[ver];
q.push({d[j],j});
}
}
}
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d %d %lld",&u,&v,&w);
g1[u].push_back({v,w});
g2[v].push_back({u,w});
e[i]={u,v,w};
}
dij(g1,d1,1);dij(g2,d2,n);
int k;
cin>>k;
while(k--)
{
ll x;
cin>>x;
if(d1[e[x].v]+d2[e[x].u]+e[x].w<d1[n])
{
cout<<"YES"<<endl;
}
else cout<<"NO"<<endl;
}
}