Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const int Q = (int)1e4 + 7;
- int n, m, k;
- int ct[5];
- vll d[5];
- vpii g[MAXN];
- ll ans = LINF;
- void upd(int x, int id)
- {
- d[id][ct[id]] = 0;
- set<pii> q;
- q.insert(mk(0, ct[id]));
- while (!q.empty())
- {
- int u = (*q.begin()).Y;
- q.erase(*q.begin());
- for (auto to : g[u])
- {
- if (d[id][to.X] > d[id][u] + to.Y)
- {
- q.erase(mk(d[id][to.X], to.X));
- d[id][to.X] = d[id][u] + to.Y;
- q.insert(mk(d[id][to.X], to.X));
- }
- }
- }
- }
- ll calc(int u)
- {
- ll dp[1 << 5][5];
- forn(msk, (1 << k))
- {
- forn(i, k)
- dp[msk][i] = LINF;
- }
- forn(i, k)
- dp[0][i] = 0;
- forn(i, k)
- {
- dp[(1 << i)][i] = d[i][u];
- }
- forn(msk, (1 << k))
- {
- forn(i, k)
- {
- if ((msk >> i) & 1)
- {
- forn(j, k)
- {
- if (!((msk >> j) & 1))
- dp[msk | (1 << j)][j] = min(dp[msk | (1 << j)][j], dp[msk][i] + d[i][ct[j]]);
- }
- }
- }
- }
- ll ans = LINF;
- forn(i, k)
- ans = min(ans, dp[(1 << k) - 1][i] + d[i][u]);
- return ans;
- }
- int solve()
- {
- scanf("%d %d %d", &n, &m, &k);
- forn(i, k)
- scanf("%d", &ct[i]), --ct[i], d[i].resize(n), fill(all(d[i]), INF);
- forn(i, m)
- {
- int x, y, c;
- scanf("%d %d %d", &x, &y, &c);
- --x, --y;
- g[x].inb(mk(y, c));
- g[y].inb(mk(x, c));
- }
- forn(i, k)
- upd(ct[i], i);
- forn(i, n)
- {
- int f = 1;
- forn(j, k)
- if (i == ct[i])
- f = 0;
- if (f)
- ans = min(ans, calc(i));
- }
- cout << ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement