73pts,写的是和xht一样的双log,有神仙帮忙看看吗/kel
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n, m, k, T, ans = 0x3f3f3f3f3f3f3f3f, c[100010], s, t, d[100010];
bool vis[100010];
struct node{
int v, w;
};
vector<node>l[100010];
int read()
{
int x = 0,f = 1;
char c = getchar();
while (c != EOF && !isdigit(c)) {if (c == '-') f = -1;c = getchar();}
while (isdigit(c)) {x = x * 10 + c - '0';c = getchar();}
return x * f;
}
void write(int x)
{
if (x < 0) putchar('-'),x = -x;
if (x > 9) write(x/10);
putchar(x%10+'0');
}
void writeln(int x){write(x),putchar('\n');}
vector<int>del;
void clear()
{
l[s].clear();
for(int i = 0;i < del.size();i ++)l[del[i]].pop_back();
del.clear();
}
priority_queue<pair<int, int> >q;
int dij()
{
memset(d, 0x3f, sizeof(d));
memset(vis, false, sizeof(vis));
while(! q.empty())q.pop();
q.push(make_pair(0, s));
d[s] = 0;
while(q.size())
{
int x = q.top().second;
q.pop();
if(vis[x])continue;
vis[x] = true;
for(int i = 0;i < l[x].size();i ++)
{
int y = l[x][i].v, z = l[x][i].w;
if(d[y] > d[x] + z)
{
d[y] = d[x] + z;
q.push(make_pair(- d[y], y));
}
}
}
return d[t];
}
signed main()
{
T = read();
while(T --)
{
ans = 0x3f3f3f3f3f3f3f3f;
n = read();
m = read();
k = read();
for(int i = 1;i <= m;i ++)
{
int u = read(), v = read(), w = read();
if(u != v)l[u].push_back(node{v, w});
}
for(int i = 1;i <= k;i ++)c[i] = read();
s = n + 1;
t = n + 2;
for(int i = 1;i <= 2 * n;i <<= 1)
{
for(int j = 1;j <= k;j ++)
{
if(c[j] & i)l[s].push_back(node{c[j], 0});
else
{
l[c[j]].push_back(node{t, 0});
del.push_back(c[j]);
}
}
ans = min(ans, dij());
clear();
for(int j = 1;j <= k;j ++)
{
if(c[j] & i == 0)l[s].push_back(node{c[j], 0});
else
{
l[c[j]].push_back(node{t, 0});
del.push_back(c[j]);
}
}
ans = min(ans, dij());
clear();
}
cout<<ans<<endl;
for(int i = 1;i <= n;i ++)l[i].clear();
}
return 0;
}