Rt./tt
code:
#include <iostream>
#include <queue>
#include <cstring>
#define int long long
#define INF 0x3f3f3f3f
using namespace std;
int n, m, s, lnsz, head[500010], dijkstra_hr[500010], dijkstra_rn[500010];
bool cg[500010];
struct cmp_hr
{
bool operator()(int a, int b) const
{
return dijkstra_hr[a] > dijkstra_hr[b];
}
};
struct cmp_rn
{
bool operator()(int a, int b) const
{
return dijkstra_rn[a] > dijkstra_rn[b];
}
};
priority_queue<int, vector<int>, cmp_hr> q_hr;
priority_queue<int, vector<int>, cmp_rn> q_rn;
bool goed[500010];
struct ln
{
int u, v, sz, nxt;
} a[1000010];
void merge(int u, int v, int sz)
{
a[++lnsz].u = u;
a[lnsz].v = v;
a[lnsz].sz = sz;
a[lnsz].nxt = head[u];
head[u] = lnsz;
}
void dij(int start)
{
q_hr.push(start);
q_rn.push(start);
dijkstra_hr[start] = 0;
dijkstra_rn[start] = 0;
while (!q_hr.empty())
{
int t = q_hr.top();
q_hr.pop();
goed[t] = false;
for (int i = head[t]; i; i = a[i].nxt)
{
int v = a[i].v;
if (dijkstra_hr[v] > dijkstra_hr[t] + a[i].sz)
{
dijkstra_hr[v] = dijkstra_hr[t] + a[i].sz;
if (!goed[v])
{
goed[v] = true;
q_hr.push(v);
}
}
}
}
memset(goed, false, sizeof(goed));
while (!q_rn.empty())
{
int t = q_rn.top();
q_rn.pop();
goed[t] = false;
for (int i = head[t]; i; i = a[i].nxt)
{
int v = a[i].v;
if (!cg[v])
continue;
if (dijkstra_rn[v] > dijkstra_rn[t] + a[i].sz)
{
dijkstra_rn[v] = dijkstra_rn[t] + a[i].sz;
if (!goed[v])
{
goed[v] = true;
q_rn.push(v);
}
}
}
}
}
signed main()
{
int u, v, w, k;
cin >> n >> m >> k;
s = 1;
memset(cg, true, sizeof(cg));
for (int i = 0; i < k; i++)
{
int tmp;
cin >> tmp;
cg[tmp] = false;
}
for (int i = 0; i < m; i++)
{
cin >> u >> v >> w;
merge(u, v, w);
merge(v, u, w);
}
for (int i = 0; i <= n; i++)
dijkstra_hr[i] = dijkstra_rn[i] = INF;
dij(s);
int x, y;
cin >> x >> y;
cout << min(max(dijkstra_hr[x], dijkstra_rn[y]), max(dijkstra_rn[x], dijkstra_hr[y])) << endl;
return 0;
}