Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.57 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define pb push_back
  5. #define eb emplace_back
  6. #define mk make_pair
  7. #define fi first
  8. #define se second
  9. #define loop(x) for (int i = 0;i < x;i++)
  10. #define each(x, xs) for (auto& x : xs)
  11. #define iter(a) a.begin(), a.end()
  12.  
  13. typedef long long ll;
  14. typedef pair<ll,ll> ii;
  15. typedef vector<ii> vii;
  16. typedef tuple<ll,ll,ll> ti;
  17. typedef vector<ti> vti;
  18. const ll INF = 1e18;
  19. const double PI = acos(-1.0);
  20.  
  21. const int T = 1e5 + 5;
  22. vector<int> g[T];
  23. int ori[T];
  24. ll dist[T];
  25. vti aresta;
  26. priority_queue<ii, vii, greater<ii> >pq;
  27. int n,k,l;
  28.  
  29. int dif(int a, int b) {
  30.     int u = get<0>(aresta[b]);
  31.     int v = get<1>(aresta[b]);
  32.     if(u != a) return u;
  33.     return v;
  34. }
  35.  
  36. ll dij() {
  37.     while(!pq.size()) {
  38.     ii at = pq.top();
  39.     pq.pop();
  40.  
  41.     int u = get<0>(aresta[at.se]);
  42.     int v = get<1>(aresta[at.se]);
  43.     int d = at.fi;
  44.     int nxt;
  45.  
  46.     if(!ori[u]) ori[u] = ori[v], dist[u] = dist[v] + d, nxt = u;
  47.     else if(!ori[v]) ori[v] = ori[u], dist[v] = dist[u] + d, nxt = v;
  48.     else return (dist[u] + dist[v] + d);
  49.    
  50.     for(auto z : g[nxt]) {
  51.         int pqp = dif(nxt,z);
  52.         if(ori[pqp] != ori[nxt]) {
  53.        
  54.  
  55.         }
  56.  
  57.     }
  58.     }
  59. }
  60.  
  61. int main() {
  62.     ios_base::sync_with_stdio(false);
  63.     memset(dist, INF, sizeof INF);
  64.     cin >> n >> k >> l;
  65.     for(int i = 0; i < n; i++) cin >> x, ori[x] = x;
  66.     for(int i = 0; i < l; i++) {
  67.     int a,b,c;
  68.     cin >> a >> b >> c;
  69.     if(ori[a] == a or ori[b] == b) pq.emplace(c,aresta.size());
  70.     g[a].pb(aresta.size());
  71.     g[b].pb(aresta.size());
  72.     aresta.eb(a,b,c);
  73.     }
  74.     cout << 3ll*dij() << endl;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement