Advertisement
K_Y_M_bl_C

Untitled

Feb 17th, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.82 KB | None | 0 0
  1. const int Q = (int)1e4 + 7;
  2.  
  3. int n, m, k;
  4. int ct[5];
  5. vll d[5];
  6. vpii g[MAXN];
  7. ll ans = LINF;
  8.  
  9. void upd(int x, int id)
  10. {
  11.     d[id][ct[id]] = 0;
  12.     set<pii> q;
  13.     q.insert(mk(0, ct[id]));
  14.     while (!q.empty())
  15.     {
  16.         int u = (*q.begin()).Y;
  17.         q.erase(*q.begin());
  18.         for (auto to : g[u])
  19.         {
  20.             if (d[id][to.X] > d[id][u] + to.Y)
  21.             {
  22.                 q.erase(mk(d[id][to.X], to.X));
  23.                 d[id][to.X] = d[id][u] + to.Y;
  24.                 q.insert(mk(d[id][to.X], to.X));
  25.             }
  26.         }
  27.     }
  28. }
  29.  
  30. ll calc(int u)
  31. {
  32.     ll dp[1 << 5][5];
  33.     forn(msk, (1 << k))
  34.     {
  35.         forn(i, k)
  36.             dp[msk][i] = LINF;
  37.     }
  38.     forn(i, k)
  39.         dp[0][i] = 0;
  40.     forn(i, k)
  41.     {
  42.         dp[(1 << i)][i] = d[i][u];
  43.     }
  44.     forn(msk, (1 << k))
  45.     {
  46.         forn(i, k)
  47.         {
  48.             if ((msk >> i) & 1)
  49.             {
  50.                 forn(j, k)
  51.                 {
  52.                     if (!((msk >> j) & 1))
  53.                         dp[msk | (1 << j)][j] = min(dp[msk | (1 << j)][j], dp[msk][i] + d[i][ct[j]]);
  54.                 }
  55.             }
  56.         }
  57.     }
  58.     ll ans = LINF;
  59.     forn(i, k)
  60.         ans = min(ans, dp[(1 << k) - 1][i] + d[i][u]);
  61.     return ans;
  62. }
  63.  
  64. int solve()
  65. {
  66.     scanf("%d %d %d", &n, &m, &k);
  67.     forn(i, k)
  68.         scanf("%d", &ct[i]), --ct[i], d[i].resize(n), fill(all(d[i]), INF);
  69.     forn(i, m)
  70.     {
  71.         int x, y, c;
  72.         scanf("%d %d %d", &x, &y, &c);
  73.         --x, --y;
  74.         g[x].inb(mk(y, c));
  75.         g[y].inb(mk(x, c));
  76.     }
  77.     forn(i, k)
  78.         upd(ct[i], i);
  79.     forn(i, n)
  80.     {
  81.         int f = 1;
  82.         forn(j, k)
  83.             if (i == ct[i])
  84.                 f = 0;
  85.         if (f)
  86.             ans = min(ans, calc(i));
  87.     }
  88.     cout << ans;
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement