rt, 正常跑只有54分慢的一批,吸氧后快了一倍跑得飞快,复杂度是log2的,是中间写挂了还是单纯我人傻常数大?
#include <bits/stdc++.h>
using namespace std;
#define int long long
inline int read() {
int r = 1, s = 0;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')
r = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
s = s * 10 + ch - '0';
ch = getchar();
}
return r * s;
}
inline void write(int x) {
if (x < 0) {
putchar('-');
x = -x;
}
if (x > 9) {
write(x / 10);
}
putchar(x % 10 ^ 48);
return;
}
const int N = 1e5 + 10;
const int M = 5e5 + 10;
int n, m, k, T, ans;
int Node[N], s, t, dis[N];
bool vis[N];
priority_queue <pair <int, int> >q;
struct Graph {
struct Edge {
int nxt, to, val;
}e[M];
int head[N], cnte;
void add(int x, int y, int z) {
e[++ cnte] = (Edge){head[x], y, z};
head[x] = cnte;
}
void clear() {
memset(head, 0, sizeof head);
cnte = 0;
}
}g, f;
void dij() {
memset(dis, 0x3f, sizeof dis);
memset(vis, 0, sizeof vis);
while(q.size()) q.pop();
dis[s] = 0;
q.push(make_pair(0, s));
while (q.size()) {
int u = q.top().second;
q.pop();
if (vis[u]) continue;
vis[u] = true;
for (int i = f.head[u]; i; i = f.e[i].nxt) {
int v = f.e[i].to;
if (vis[v]) continue;
int w = f.e[i].val;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
q.push(make_pair(-dis[v], v));
}
}
}
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("5304.in", "r", stdin);
freopen("5304.out", "w", stdout);
#endif
T = read();
while (T --) {
n = read(), m = read(), k = read();
g.clear();
ans = 2e18;
for (int i = 1, u, v, w; i <= m; ++ i) {
u = read(), v = read(), w = read();
g.add (u, v, w);
}
for (int i = 1; i <= k; ++ i) {
Node[i] = read();
}
s = n + 1, t = n + 2;
for (int bit = 0; bit < 17; ++ bit) {
f = g;
for (int i = 1; i <= k; ++ i) {
if ((i >> bit) & 1)
f.add(Node[i], t, 0);
else
f.add(s, Node[i], 0);
}
dij();
ans = min(ans, dis[t]);
}
for (int bit = 0; bit < 17; ++ bit) {
f = g;
for (int i = 1; i <= k; ++ i) {
if (((i >> bit) & 1) == 0)
f.add(Node[i], t, 0);
else
f.add(s, Node[i], 0);
}
dij();
ans = min(ans, dis[t]);
}
write(ans);
puts(" ");
}
return 0;
}