#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mx = 5e3+5;
const int inf = 1e18;
int n, m, k;
int t[mx];
vector<pair<int, int>> g[mx<<5];
long long dis[mx<<5];
signed main() {
cin >> n >> m >> k;
for (int i=0;i<k;i++) cin >> t[i];
for (int i=0;i<m;i++) {
int u, v, c;
cin >> u >> v >> c;
for (int j=0;j<1<<5;j++) {
g[v<<5|j].push_back({u<<5|j, c});
for (int k=1;k<1<<5;k<<=1) {
if (j&k) continue;
g[v<<5|j].push_back({u<<5|j|k, c});
}
}
}
fill(dis, dis+((n+1)<<5), inf);
priority_queue<pair<int, int>> pq;
for (int i=0;i<k;i++) {
for (int j=0;j<1<<5;j++) {
dis[t[i]<<5|j] = 0;
pq.push({-0, t[i]<<5|j});
}
}
int mask = (1<<5)-1;
while (pq.size()) {
auto [d, u] = pq.top(); pq.pop();
d = -d;
if (d != dis[u]) continue;
for (auto [v, c]:g[u]) {
if ((v&mask) == (u&mask)) {
if (dis[v] > dis[u] + c) {
dis[v] = dis[u] + c;
pq.push({-dis[v], v});
}
} else {
int x = __lg((v&mask)^(u&mask)) + 1;
if (dis[v] > dis[u] + c / 10 * (10-x)) {
dis[v] = dis[u] + c / 10 * (10-x);
pq.push({-dis[v], v});
}
}
}
}
int q;
cin >> q;
while (q--) {
int s;
int p[5];
cin >> s;
for (int i=0;i<5;i++) cin >> p[i];
for (int i=0;i<5;i++) if (p[i]==-1) p[i] = inf;
int ans = inf;
for (int i=0;i<1<<5;i++) {
int cnt = dis[s<<5|i];
for (int j=0;j<5;j++) {
if ((1<<j)&i) {
cnt += p[j];
}
}
ans = min(cnt, ans);
}
cout << (ans == inf ? -1 : ans) << "\n";
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |