比赛 |
2025.6.2 |
评测结果 |
WWEEEEEEEEWE |
题目名称 |
旅行者 |
最终得分 |
0 |
用户昵称 |
LikableP |
运行时间 |
2.283 s |
代码语言 |
C++ |
内存使用 |
9.62 MiB |
提交时间 |
2025-06-02 13:51:27 |
显示代码纯文本
#include <cstdio>
#include <queue>
#include <cstring>
typedef long long ll;
#define min(__a, __b) [&](ll _a, ll _b) {return _a < _b ? _a : _b;} ((__a), (__b))
const int MAXN = 1e5 + 10;
const int MAXM = 5e5 + 10;
struct edge{
int v;
ll w;
edge() {}
edge(int v, ll w) : v(v), w(w) {}
};
::std::vector <edge> g[MAXN];
struct node {
ll dis;
int u;
node() {}
node(ll dis, int u) : dis(dis), u(u) {}
bool operator > (const node &a) const {return dis > a.dis;}
};
ll dis[MAXN];
bool vis[MAXN];
::std::priority_queue <node, ::std::vector <node>, ::std::greater <node>> q;
void Dijkstra(int n, int s) {
memset(dis, 0x3f, (n + 1) * sizeof(int));
memset(vis, 0, (n + 1) * sizeof(int));
dis[s] = 0;
q.push(node(0, s));
while (!q.empty()) {
int u = q.top().u;
q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (auto ed : g[u]) {
int v = ed.v; ll w = ed.w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
q.push(node(dis[v], v));
}
}
}
}
int T;
ll ans;
int main() {
freopen("WAW.in", "r", stdin);
freopen("WAW.out", "w", stdout);
scanf("%d", &T);
while (T--) {
ans = 0x7fffffffffffffff;
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
for (int i = 1; i <= m; ++i) {
int u, v; ll w;
scanf("%d %d %lld", &u, &v, &w);
if (u == v) continue;
g[u].push_back(edge(v, w));
}
::std::vector <int> like(k + 1, 0);
for (int i = 1; i <= k; ++i) {
scanf("%d", &like[i]);
}
for (int i = 1; i <= k - 1; ++i) {
Dijkstra(n, like[i]);
for (int j = i + 1; j <= k; ++j) {
ans = min(ans, dis[j]);
}
}
printf("%lld\n", ans);
for (int i = 1; i <= n; ++i) g[i].clear();
}
return 0;
}