Submission #1333203

#TimeUsernameProblemLanguageResultExecution timeMemory
1333203maomaoEvacuation plan (IZhO18_plan)C++20
0 / 100
157 ms59032 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,s,n) for(int i=s;i<=n;i++)
#define vi vector<int>
#define pb push_back
#define pii pair<int,int>
#define eb emplace_back
#define fi first
#define se second
#define tup array<int, 3>
const int N = 1e5 + 5, L = 20;
vector<vector<pii>> adj(N), g(N);
int a,b,w;
vi pa(N), dep(N), dist(N, LLONG_MAX);
pii par[20][N];

int fpar(int u) {
	if(pa[u] == u) return pa[u];
	return pa[u] = fpar(pa[u]);
}


int lca(int u, int v) {
	int res = LLONG_MAX;
	if(dep[u] > dep[v]) swap(u, v);
	int dif = dep[v] - dep[u];
	for(int i=19;i>=0;i--) if(dif>>i & 1) {
		res = min(res,par[i][v].se);
		v=par[i][v].fi;
	}
	if(u==v) return res;
	for(int i=19;i>=0;i--) {
		if(par[i][u].fi != par[i][v].fi) {
			u=par[i][u].fi; v=par[i][v].fi;
			res=min({res,par[i][u].se,par[i][v].se});
		} else if(par[i][u].fi!=0){
			res=min({res,par[i][u].se,par[i][v].se});
		}
	}
	return res;
}

void dfs(int u, int pp) {
	par[0][u] = {pp, dist[u]};
	for(pii p : g[u]) {
		if(p.fi==pp) continue;
		dep[p.fi] = dep[u] + 1;
		dfs(p.fi, u);
	}
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,m;
    cin>>n>>m;
    rep(i,1,n) pa[i] = i;
    vector<tup> ed;
    rep(i,1,m) {
		cin>>a>>b>>w;
		ed.pb({w,a,b});
		adj[a].eb(b,w);
		adj[b].eb(a,w);
	}
	
	priority_queue<pii, vector<pii>, greater<pii>> pq;
	int k; cin>>k;
	rep(i,1,k) {
		cin>>a;
		dist[a]=0;
		pq.push({0,a});
	}
	

	//compute min dist from x to all special cities
	while(!pq.empty()) {
		w = pq.top().fi;
		a = pq.top().se;
		pq.pop();
		for(pii p1 : adj[a]) {
			if(dist[p1.fi]>w+p1.se) {
				dist[p1.fi] = w+p1.se;
				pq.push({dist[p1.fi], p1.fi});
			}
		}
	}
	
	//maximum spanning tree
	for(tup &t:ed) t[0] = min(dist[t[1]], dist[t[2]]);
	sort(ed.begin(), ed.end(), greater<tup>());
	
	for(tup t : ed) {
		a=t[1]; b=t[2]; w=t[0];
		if(fpar(a) != fpar(b)) {
			g[a].eb(b,w);
			g[b].eb(a,w);
			pa[fpar(a)] = fpar(b);
		}
	}

	//dfs tree rooted at 1
	dep[1] = 1;
	dfs(1, 0);

	rep(i,1,19) rep(j,1,n) {
		par[i][j].fi=par[i-1][par[i-1][j].fi].fi;
		par[i][j].se = min(par[i-1][j].se,par[i-1][par[i-1][j].fi].se);
	}
	
	int q; cin>>q;
	while(q--) {
		cin>>a>>b;
		cout << lca(a,b) << "\n";
	}
    return 0;
}



#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...