Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define fo(i,s,t) for(int i = s; i <= t; ++ i)
- #define fd(i,s,t) for(int i = s; i >= t; -- i)
- #define bf(i,s) for(int i = head[s]; i; i = e[i].next)
- #define mp make_pair
- #define fi first
- #define se second
- #define pii pair<int,int>
- #define pb push_back
- #define VI vector<int>
- #define sf scanf
- #define pf printf
- #define fp freopen
- #define SZ(x) ((int)(x).size())
- #define IF_DEBUG 0
- // #define MPS
- typedef long long ll;
- typedef double db;
- typedef unsigned long long ull;
- const int inf = 1<<30;
- const ll INF = 1ll<<60;
- const db Inf = 1e20;
- const db eps = 1e-9;
- void gmax(int &a,int b){a = (a > b ? a : b);}
- void gmin(int &a,int b){a = (a < b ? a : b);}
- const int maxn = 100005;
- const int maxm = 300050;
- int n, m, C[maxn], f[maxn], son[maxn];
- struct edge{int u, v, w;};
- vector<edge> Graph[maxm];
- vector<pii> Legit[maxm*18], adj[maxn];
- int S, E, Siz, Centroid, fa[maxn], vis[maxn];
- bool inq[maxm*18];
- int tot;
- ll Dist[maxm*18];
- vector<pii> nodes;
- bool cmp(edge a, edge b) {return a.w < b.w;}
- int getfa(int x) {return fa[x] == x ? x : fa[x] = getfa(fa[x]);}
- int Gao(int u,int x,int fa=0) // get the centroid in the subtree of u (in the x-th MST)
- {
- f[u] = 1; son[u] = 0;
- for(auto p : adj[u])
- if(vis[p.se] != x && p.se != fa)
- {
- Gao(p.se, x, u);
- f[u] += f[p.se];
- son[u] = max(son[u], f[p.se]);
- }
- son[u] = max(son[u], Siz - f[u]);
- if(son[u] < son[Centroid]) Centroid = u;
- }
- void link(int u, int v, int w)
- {
- // cout << u << ' ' << v << ' ' << w << endl;
- Legit[u].pb(mp(v, w));
- }
- void Getnode(int u,int x,int v,int fa)
- {
- nodes.pb(mp(v, u));
- for(auto p : adj[u])
- if(vis[p.se] != x && p.se != fa)
- Getnode(p.se, x, max(v, p.fi), u);
- }
- void Divide(int u,int x)
- {
- vis[u] = x;
- nodes.clear();
- nodes.pb(mp(0, u));
- for(auto p : adj[u])
- if(vis[p.se] != x)
- Getnode(p.se, x, p.fi, u);
- sort(nodes.begin(), nodes.end());
- // for(auto p : nodes) cout << "shit" << u << ' ' << p.fi << ' ' << p.se << endl;
- fo(i,0,SZ(nodes)-1)
- {
- pii p = nodes[i];
- ++ tot; link(tot, p.se, p.fi);
- if(i != SZ(nodes)-1) link(tot, tot+1, 0), link(p.se, tot+1, C[p.se]);
- }
- fo(i,0,SZ(nodes)-1)
- {
- pii p = nodes[i];
- ++ tot; link(tot, p.se, 0);
- if(i != SZ(nodes)-1)
- {
- link(tot+1, tot, 0);
- link(nodes[i+1].se, tot, C[nodes[i+1].se]+nodes[i+1].fi);
- }
- }
- for(auto p : adj[u])
- if(vis[p.se] != x)
- {
- Centroid = 0; Siz = f[p.se];
- Gao(p.se, x, u);
- Divide(Centroid, x);
- }
- }
- void Work()
- {
- son[0] = n;
- fo(i,1,m) if(SZ(Graph[i]))
- {
- Siz = 0;
- sort(Graph[i].begin(),Graph[i].end(),cmp);
- for(auto p : Graph[i])
- {
- fa[p.u] = p.u, fa[p.v] = p.v;
- adj[p.u].clear(), adj[p.v].clear();
- inq[p.u] = inq[p.v] = false;
- }
- for(auto p : Graph[i]) if(getfa(p.u) != getfa(p.v))
- {
- if(!inq[p.u]) ++ Siz, inq[p.u] = true;
- if(!inq[p.v]) ++ Siz, inq[p.v] = true;
- fa[getfa(p.u)] = getfa(p.v);
- adj[p.u].pb(mp(p.w, p.v));
- adj[p.v].pb(mp(p.w, p.u));
- }
- Centroid = 0;
- Gao(Graph[i][0].u, i);
- Divide(Centroid, i);
- }
- }
- ll Dijkstra(int s,int e)
- {
- priority_queue<pair<ll,int>, vector<pair<ll,int> >, greater<pair<ll,int> > > pq;
- memset(inq,0,sizeof(inq));
- fo(i,1,tot) Dist[i] = INF;
- pq.push(mp(0,s)); Dist[s] = 0;
- while(!pq.empty())
- {
- pii h = pq.top(); pq.pop();
- inq[h.se] = false;
- if(Dist[h.se] > Dist[e]) continue;
- for(auto p : Legit[h.se])
- {
- if(Dist[p.fi] > Dist[h.se] + p.se)
- {
- Dist[p.fi] = Dist[h.se] + p.se;
- if(!inq[p.fi])
- inq[p.fi] = true, pq.push(mp(Dist[p.fi], p.fi));
- }
- }
- }
- return Dist[e];
- }
- int main()
- {
- #ifdef MPS
- fp("lightcycle.in","r",stdin);
- fp("lightcycle.out","w",stdout);
- #endif
- sf("%d%d",&n,&m);
- fo(i,1,n) sf("%d",&C[i]);
- fo(i,1,m)
- {
- int a, b, f, e;
- sf("%d%d%d%d",&a,&b,&f,&e);
- Graph[f].pb((struct edge){a,b,e});
- }
- tot = n;
- Work();
- sf("%d%d",&S,&E);
- pf("%lld\n",Dijkstra(S,E));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement