Advertisement
trungore10

dwarf_sol_Writer_by Ta Quy

Dec 7th, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.67 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define int         long long
  3. using namespace std;
  4.  
  5. void Read(int &val) {
  6.     val = 0; char c;
  7.     do { c = getchar(); } while (!isdigit(c));
  8.     while (isdigit(c)) { val = val * 10 + c - '0'; c = getchar(); }
  9. }
  10.  
  11. typedef pair<int, int> ii;
  12.  
  13. const int N = 2e5 + 4, oo = 1e16 + 4;
  14. int n, orgN, m, cost[N];
  15. ii comp[N];
  16. vector<int> adj[N];
  17. map<ii, int> Map;
  18.  
  19. int d[N];
  20. priority_queue<ii, vector<ii>, greater<ii> > pq;
  21.  
  22. void sol() {
  23.     for (int i = 1; i <= n; ++i) d[i] = oo;
  24.     for (int i = 1; i <= orgN; ++i) {
  25.         d[i] = cost[i]; pq.push(ii(d[i], i));
  26.     }
  27.  
  28.     while (pq.size()) {
  29.         int u = pq.top().second, du = pq.top().first; pq.pop();
  30.         if (du != d[u]) continue;
  31.         for (int v : adj[u]) {
  32.             if (v <= orgN) {
  33.                 assert(u > orgN);
  34.                 if (d[v] > d[u]) { d[v] = d[u]; pq.push(ii(d[v], v)); }
  35.             }
  36.             else {
  37.                 assert(u <= orgN);
  38.                 if (d[v] > d[comp[v].first] + d[comp[v].second]) {
  39.                     d[v] = d[comp[v].first] + d[comp[v].second];
  40.                     pq.push(ii(d[v], v));
  41.                 }
  42.             }
  43.         }
  44.     }
  45.     cout << d[1] << '\n';
  46. }
  47.  
  48. #undef int
  49. int main() {
  50. #define int         long long
  51.     if (fopen("input.txt", "r")) {
  52.         freopen("input.txt", "r", stdin);
  53.     }
  54.     else {
  55.         freopen("dwarf.inp", "r", stdin);
  56.         freopen("dwarf.out", "w", stdout);
  57.     }
  58.  
  59.     Read(n); Read(m); orgN = n;
  60.     for (int i = 1; i <= n; ++i) Read(cost[i]);
  61.     for (int i = 1; i <= n; ++i) comp[i] = ii(i, i);
  62.  
  63.     int dad, u, v;
  64.     for (int i = 1; i <= m; ++i) {
  65.         Read(dad); Read(u); Read(v);
  66.         if (u > v) swap(u, v);
  67.  
  68.         if (!Map[ii(u, v)]) Map[ii(u, v)] = ++n, comp[n] = ii(u, v);
  69.         int ver = Map[ii(u, v)];
  70.         adj[ver].push_back(dad);
  71.         adj[u].push_back(ver); adj[v].push_back(ver);
  72.     }
  73.  
  74.     sol();
  75.  
  76.     return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement