Advertisement
Guest User

Untitled

a guest
Nov 15th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.93 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define fo(i,s,t) for(int i = s; i <= t; ++ i)
  5. #define fd(i,s,t) for(int i = s; i >= t; -- i)
  6. #define bf(i,s) for(int i = head[s]; i; i = e[i].next)
  7. #define mp make_pair
  8. #define fi first
  9. #define se second
  10. #define pii pair<int,int>
  11. #define pb push_back
  12. #define VI vector<int>
  13. #define sf scanf
  14. #define pf printf
  15. #define fp freopen
  16. #define SZ(x) ((int)(x).size())
  17. #define IF_DEBUG 0
  18. // #define MPS
  19. typedef long long ll;
  20. typedef double db;
  21. typedef unsigned long long ull;
  22. const int inf = 1<<30;
  23. const ll INF = 1ll<<60;
  24. const db Inf = 1e20;
  25. const db eps = 1e-9;
  26.  
  27. void gmax(int &a,int b){a = (a > b ? a : b);}
  28. void gmin(int &a,int b){a = (a < b ? a : b);}
  29.  
  30. const int maxn = 100005;
  31. const int maxm = 300050;
  32.  
  33. int n, m, C[maxn], f[maxn], son[maxn];
  34. struct edge{int u, v, w;};
  35. vector<edge> Graph[maxm];
  36. vector<pii> Legit[maxm*18], adj[maxn];
  37. int S, E, Siz, Centroid, fa[maxn], vis[maxn];
  38. bool inq[maxm*18];
  39. int tot;
  40. ll Dist[maxm*18];
  41. vector<pii> nodes;
  42.  
  43. bool cmp(edge a, edge b) {return a.w < b.w;}
  44. int getfa(int x) {return fa[x] == x ? x : fa[x] = getfa(fa[x]);}
  45. int Gao(int u,int x,int fa=0) // get the centroid in the subtree of u (in the x-th MST)
  46. {
  47.     f[u] = 1; son[u] = 0;
  48.     for(auto p : adj[u])
  49.         if(vis[p.se] != x && p.se != fa)
  50.         {
  51.             Gao(p.se, x, u);
  52.             f[u] += f[p.se];
  53.             son[u] = max(son[u], f[p.se]);
  54.         }
  55.     son[u] = max(son[u], Siz - f[u]);
  56.     if(son[u] < son[Centroid]) Centroid = u;
  57. }
  58. void link(int u, int v, int w)
  59. {
  60.     // cout << u << ' ' << v << ' ' << w << endl;
  61.     Legit[u].pb(mp(v, w));
  62. }
  63. void Getnode(int u,int x,int v,int fa)
  64. {
  65.     nodes.pb(mp(v, u));
  66.     for(auto p : adj[u])
  67.         if(vis[p.se] != x && p.se != fa)
  68.             Getnode(p.se, x, max(v, p.fi), u);
  69. }
  70. void Divide(int u,int x)
  71. {
  72.     vis[u] = x;
  73.     nodes.clear();
  74.     nodes.pb(mp(0, u));
  75.     for(auto p : adj[u])
  76.         if(vis[p.se] != x)
  77.             Getnode(p.se, x, p.fi, u);
  78.     sort(nodes.begin(), nodes.end());
  79.     // for(auto p : nodes) cout << "shit" << u << ' ' << p.fi << ' ' << p.se << endl;
  80.     fo(i,0,SZ(nodes)-1)
  81.     {
  82.         pii p = nodes[i];
  83.         ++ tot; link(tot, p.se, p.fi);
  84.         if(i != SZ(nodes)-1) link(tot, tot+1, 0), link(p.se, tot+1, C[p.se]);
  85.     }
  86.     fo(i,0,SZ(nodes)-1)
  87.     {
  88.         pii p = nodes[i];
  89.         ++ tot; link(tot, p.se, 0);
  90.         if(i != SZ(nodes)-1)
  91.         {
  92.             link(tot+1, tot, 0);
  93.             link(nodes[i+1].se, tot, C[nodes[i+1].se]+nodes[i+1].fi);
  94.         }
  95.     }
  96.     for(auto p : adj[u])
  97.         if(vis[p.se] != x)
  98.         {
  99.             Centroid = 0; Siz = f[p.se];
  100.             Gao(p.se, x, u);
  101.             Divide(Centroid, x);
  102.         }
  103. }
  104. void Work()
  105. {
  106.     son[0] = n;
  107.     fo(i,1,m) if(SZ(Graph[i]))
  108.     {
  109.         Siz = 0;
  110.         sort(Graph[i].begin(),Graph[i].end(),cmp);
  111.         for(auto p : Graph[i])
  112.         {
  113.             fa[p.u] = p.u, fa[p.v] = p.v;
  114.             adj[p.u].clear(), adj[p.v].clear();
  115.             inq[p.u] = inq[p.v] = false;
  116.         }
  117.         for(auto p : Graph[i]) if(getfa(p.u) != getfa(p.v))
  118.         {
  119.             if(!inq[p.u]) ++ Siz, inq[p.u] = true;
  120.             if(!inq[p.v]) ++ Siz, inq[p.v] = true;
  121.             fa[getfa(p.u)] = getfa(p.v);
  122.             adj[p.u].pb(mp(p.w, p.v));
  123.             adj[p.v].pb(mp(p.w, p.u));
  124.         }
  125.         Centroid = 0;
  126.         Gao(Graph[i][0].u, i);
  127.         Divide(Centroid, i);
  128.     }
  129. }
  130. ll Dijkstra(int s,int e)
  131. {
  132.     priority_queue<pair<ll,int>, vector<pair<ll,int> >, greater<pair<ll,int> > > pq;
  133.     memset(inq,0,sizeof(inq));
  134.     fo(i,1,tot) Dist[i] = INF;
  135.     pq.push(mp(0,s)); Dist[s] = 0;
  136.     while(!pq.empty())
  137.     {
  138.         pii h = pq.top(); pq.pop();
  139.         inq[h.se] = false;
  140.         if(Dist[h.se] > Dist[e]) continue;
  141.         for(auto p : Legit[h.se])
  142.         {
  143.             if(Dist[p.fi] > Dist[h.se] + p.se)
  144.             {
  145.                 Dist[p.fi] = Dist[h.se] + p.se;
  146.                 if(!inq[p.fi])
  147.                     inq[p.fi] = true, pq.push(mp(Dist[p.fi], p.fi));
  148.             }
  149.         }
  150.     }
  151.     return Dist[e];
  152. }
  153. int main()
  154. {
  155.     #ifdef MPS
  156.         fp("lightcycle.in","r",stdin);
  157.         fp("lightcycle.out","w",stdout);
  158.     #endif
  159.     sf("%d%d",&n,&m);
  160.     fo(i,1,n) sf("%d",&C[i]);
  161.     fo(i,1,m)
  162.     {
  163.         int a, b, f, e;
  164.         sf("%d%d%d%d",&a,&b,&f,&e);
  165.         Graph[f].pb((struct edge){a,b,e});
  166.     }
  167.     tot = n;
  168.     Work();
  169.     sf("%d%d",&S,&E);
  170.     pf("%lld\n",Dijkstra(S,E));
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement