比赛 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;
}