# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
45082 | nibnalin | Cities (BOI16_cities) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
const int maxn = lli(1e5)+5, maxk = 6;
const lli inf = lli(1e17)+5;
int n, A[maxk];
lli D[maxk][maxn], dp[(1<<maxk)][maxn];
vector<pair<int, lli>> graph[maxn];
void read(int &res) {
res=0;
while(*buffp<48) ++buffp;
while(*buffp>47) res=(res<<3)+(res<<1)+*buffp++-48;
}
int main(void)
{
int k, m, u, v;
lli w;
read(n); read(k); read(m);
for(int i = 0;i < k;i++)
{
read(A[i]);
A[i]--;
}
for(int i = 0;i < m;i++)
{
read(u); read(v); read(w);
u--, v--;
graph[u].push_back({v, w}), graph[v].push_back({u, w});
}
for(int i = 0;i < (1<<k);i++)
{
for(int j = 0;j < n;j++) dp[i][j] = inf;
}
for(int i = 0;i < k;i++) dp[(1<<i)][A[i]] = 0;
for(int mask = 1;mask < (1<<k);mask++)
{
priority_queue<pair<lli, int>> Q;
for(int i = 0;i < n;i++)
{
for(int j = 0;j < k;j++)
{
if((mask&(1<<j))) dp[mask][i] = min(dp[mask][i], dp[(mask^(1<<j))][i]+dp[(1<<j)][i]);
}
Q.push({-dp[mask][i], i});
}
while(!Q.empty())
{
pair<lli, int> top = Q.top();
Q.pop();
for(auto it: graph[top.second])
{
if(dp[mask][it.first] > dp[mask][top.second]+it.second)
{
dp[mask][it.first] = dp[mask][top.second]+it.second;
Q.push({-dp[mask][it.first], it.first});
}
}
}
}
lli res = inf;
for(int i = 0;i < n;i++) res = min(res, dp[(1<<k)-1][i]);
printf("%lld\n", res);
}