La ruta más corta se vuelve más corta ------------------------------------ Pensamiento (ruta más corta + pregunta de rutina)

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
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;
	}
}

572 artículos originales publicados · elogiados 14 · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/qq_43690454/article/details/105451550
Recomendado
Clasificación