This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
//pantyhose(black) + glasses = infinity
#include <bits/stdc++.h>
using namespace std;
#define debug(x) cerr << #x << " = " << x << '\n';
#define BP() cerr << "OK!\n";
#define PR(A, n) {cerr << #A << " = "; for (int _=1; _<=n; ++_) cerr << A[_] << ' '; cerr << '\n';}
#define PR0(A, n) {cerr << #A << " = "; for (int _=0; _<n; ++_) cerr << A[_] << ' '; cerr << '\n';}
#define FILE_NAME "data"
typedef pair<int64_t, int> pairInts;
const int MAX_N = 100002;
const int MAX_K = 5;
const int64_t INF = 1e18;
int n, m, k, important_city[MAX_K];
int64_t f[1<<MAX_K][MAX_N];
vector<pairInts> g[MAX_N];
priority_queue<pairInts, vector<pairInts>, greater<pairInts> > pq;
void enter() {
cin >> n >> k >> m;
for (int i=0; i<k; ++i) {
cin >> important_city[i];
}
for (int i=1; i<=m; ++i) {
int u, v, w;
cin >> u >> v >> w;
g[u].push_back(make_pair(w, v));
g[v].push_back(make_pair(w, u));
}
}
void dijkstra(int x) {
for (int i=1; i<=n; ++i)
pq.push(make_pair(f[x][i], i));
while (pq.size()) {
int u = pq.top().second;
int64_t du = pq.top().first;
pq.pop();
if (du!=f[x][u])
continue;
for (int i=0; i<g[u].size(); ++i) {
int v = g[u][i].second, w = g[u][i].first;
if (f[x][v]>f[x][u]+w) {
pq.push(make_pair(f[x][v] = f[x][u] + w, v));
}
}
}
}
void dp() {
for (int x=0; x<(1<<k); ++x)
for (int i=1; i<=n; ++i)
f[x][i] = INF;
for (int i=0; i<k; ++i)
f[1<<i][important_city[i]] = 0;
for (int x=0; x<(1<<k); ++x) {
for (int u=1; u<=n; ++u) {
for (int i=0; i<g[u].size(); ++i) {
int v = g[u][i].second, w = g[u][i].first;
for (int x2 = x; x2>0; x2 = (x2 - 1) & x) {
f[x][u] = min(f[x][u], f[x2][v] + f[x^x2][u] + w);
}
}
}
dijkstra(x);
}
int64_t res = INF;
for (int i=1; i<=n; ++i)
res = min(res, f[(1<<k)-1][i]);
cout << res;
}
int main() {
#ifdef OFFLINE_JUDGE
freopen(FILE_NAME".inp", "r", stdin);
freopen(FILE_NAME".out", "w", stdout);
#endif
ios::sync_with_stdio(0); cin.tie(0);
enter();
dp();
}
Compilation message (stderr)
cities.cpp: In function 'void dijkstra(int)':
cities.cpp:45:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i=0; i<g[u].size(); ++i) {
~^~~~~~~~~~~~
cities.cpp: In function 'void dp()':
cities.cpp:62:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for (int i=0; i<g[u].size(); ++i) {
~^~~~~~~~~~~~
# | 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... |