#include <bits/stdc++.h>
#define TASK "cities"
#define endl mmm
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define BIT(i,x) (((i)>>(x))&1)
#define FOR(i,a,b) for(int i = (a); i<=(b); i++)
#define FORD(i,a,b) for(int i = (a); i>=(b); i--)
#define all(C) (C).begin(), (C).end()
using namespace std;
using ll = long long;
using pii = pair<int,int>;
const int INT_LIM = 2147483647;
const ll LL_LIM = 9223372036854775807;
template <typename X> bool minimize(X &x, const X &y) {if (x>y){x = y; return true;}return false;}
template <typename X> bool maximize(X &x, const X &y) {if (x<y){x = y; return true;}return false;}
///------------------------------------------///
const int maxn = 1e5+5;
int n, m, k;
int a[6], dd[maxn];
vector<pii> adj[maxn];
void inp()
{
cin >> n >> k >> m;
FOR(i, 1, n) dd[i] = 10;
FOR(i, 1, k)
{
cin >> a[i];
dd[a[i]] = i-1;
}
FOR(i, 1, m)
{
int u,v,c;
cin >> u >> v >> c;
adj[u].pb(mp(v,c));
adj[v].pb(mp(u,c));
}
}
ll dp[maxn][32];
void solve()
{
priority_queue<pair<ll,pii>, vector<pair<ll,pii>>, greater<pair<ll,pii>>> q;
FOR(i, 1, n) FOR(mask, 1, (1<<k)-1)
{
dp[i][mask] = LL_LIM;
if (__builtin_popcount(mask)==1 && BIT(mask,dd[i]))
{
dp[i][mask] = 0;
q.push(mp(0,mp(i,mask)));
}
}
ll ans = LL_LIM;
while (!q.empty())
{
ll d = q.top().fi;
int u = q.top().se.fi, mask = q.top().se.se;
q.pop();
if (dp[u][mask]<d) continue;
if (mask==(1<<k)-1) minimize(ans, d);
// cout << u << ' ';
// FOR(i, 0, k-1) cout << BIT(mask,i);
// cout << ' ';
// cout << d << '\n';
for (auto V:adj[u])
{
int v = V.fi, c = V.se;
FOR(mask2, 0, (1<<k)-1) if (dp[v][mask2]!=LL_LIM)
{
ll val = d+c+dp[v][mask2];
if (minimize(dp[v][mask|mask2], val))
{
q.push(mp(val, mp(v,mask|mask2)));
}
}
}
}
cout << ans;
}
signed main()
{
///--------------------------///
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
if (fopen(TASK".INP","r")!=NULL)
{
freopen(TASK".INP","r",stdin);
freopen(TASK".OUT","w",stdout);
}
///--------------------------///
int NTEST = 1;
bool multitest = 0;
if (multitest) cin >> NTEST;
while (NTEST--)
{
inp();
solve();
}
return 0;
}
///------------------------------------------///
Compilation message (stderr)
cities.cpp: In function 'int main()':
cities.cpp:96:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
96 | freopen(TASK".INP","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
cities.cpp:97:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
97 | freopen(TASK".OUT","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~| # | 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... |